goblin -> orc
ls 명령어로 디렉터리를 확인하면 orc와 orc.c가 있다.
이번 레벨에서는 egghunter로 memset함수를 이용하여 환경변수를 초기화한다.
argv [1]의 48번째는 '0 xbf'여야 한다. 이 부분은 Return Address로 Stack 주소만 허용한다.
그렇다면 buffer나 argv[2]를 이용해야 한다.
buffer는 NOP Sled를 사용하기엔 공간이 많지 않으니 argv [2]를 이용하자.
orc를 같은 길이의 이름으로 복사하고 gdb로 분석 해보면
main 함수의 스택 프레임을 보면 esp를 '0x2 c'만큼 뺀다. 0x2c는 10진수로 44다
소스코드를 보면 buffer밑에 int형으로 i가 있는 걸 볼 수 있다. 44는 buffer와 i가 할당된 것이다.
Return Address와 buffer의 offset은 SFP를 포함하여 44Byte이다.
strcpy() 함수의 호출되고 난 후인 main+197에 브레이크를 건다.
argv [1][47]이 '0 xbf'를 검증하니 48byte만큼 주고 argv [2]에 NOP Sled를 이용하여
NOP(100)과 쉘 코드의 길이 25인만큼 주고 실행한다.
argv [2]의 주소를 찾아보자.
argv[2]의 주소는 0 xbffffde9이다. 그렇다면 이제 payload를 작성해보자
Payload
buffer(40) + SFP(4) + RET(4) + ' ' + NOP(100) + shellcode(25)
Python으로 exploit code를 작성해보자.
다음 레벨인 orc의 쉘이 실행되었다.
goblin -> orc
password : cantata