1번 문제와 동일하게 strcpy를 통해 argv[1]을 buffer에 복사합니다.
다른점은 buffer의 크기가 16으로 줄어들었습니다.
가장 작은 shell code가 22-byte인 점을 고려하면 (2012년 8월 16일 기준)
buffer에 shell code를 올리는 것이 불가능합니다.
하지만
정말 불가능 할까요?
argv는 상당히 큰 크기의 값을 입력받을 수 있습니다.
BOF의 개념을 이해하셨다면 strcpy를 통해 ret 이후의 위치에도 값을 덮어씌울수가 있다는걸 아실겁니다.
Stack 구조
Low addr
buffer (16-byte)
|
sfp (4-byte)
|
ret (4-byte)
|
shell
|
High addr
shell code가 올라가는 주소를 찾기 위해 임시로 컴파일한 파일을 gdb로 열어봅니다.
argv[1]이 사용되는 strcpy 함수 위에 존재하는 main+43에 Break point를 걸고 edx를 확인해 보겠습니다.


shell code가 들어갈 주소는 ret 바로 다음인 0xbffffbe2 입니다.
이제 buffer에는 쓰레기 값을 채워놓고
shell code 이전의 nop slide 중간쯤의 주소로 return 하도록 주소값을 설정해주면 됩니다.

공격에 성공했습니다.