힌트로 arg라고 써있습니다.
fgets를 통해 overflow가 발생합니다.
Return 할 주소가 0xbf로 시작하면 메시지를 출력하고 종료합니다.
Return 할 주소가 0x08로 시작해도 메시지를 출력하고 종료합니다.
Return 할 주소를 따라갔을때 leave와 ret가 있으면 메시지를 출력하고 종료합니다.
위의 조건문을 다 회피하면
Stack을 0으로 초기화합니다.
환경변수도 지워버립니다.
아왜
한참을 막혀있다가 제 머리로는 생각이 안나서 결국 물어봤습니다.
System call을 뒤져보랍니다.
strace로 따라가봅니다.
쭉 따라가다 보면 read()가 보입니다.
read() 앞뒤로는 mmap()이 보입니다.
mmap()으로 0x40015000부터 공간을 확보합니다.
read()로 string을 입력받습니다.
fgets()가 read()를 이용하는것 같습니다.
mmap()으로 0x40016000부터 공간을 확보합니다.
입력받은 값을 stdout에 써줍니다.
각각의 주소를 따라가 보면 입력한 값이 있을듯 합니다.
gdb로 fgets() 호출 후에 위의 주소를 따라가봅니다.
0x40015000부터 입력한 값이 있는 것을 확인할 수 있습니다.
0x40016000은 접근할 수 없다고 뜹니다.
Shell code를 입력하고 ret를 0x40015000으로 돌려버리면 됩니다.
공격해봅니다.
안됩니다.
아왜
생각해보니 입력한 값에 0x00이 있으면 안됩니다.
Nop slide 중간으로 떨어뜨려줍니다.
공격에 성공했습니다.
ps. ret를 0x40016000으로 돌려주니 공격에 성공했습니다.
읭?