본문 바로가기

WARGAME/hackerschool ftz,lob

[해커스쿨 ftz] level 13 -> level 14

hint

#include <stdlib.h>


main ( int argc, char *argv[] )

{

long i = 0x1234567;

char buf[1024];


setreuid(3094, 3094);

if(argc > 1)

strcpy(buf, argv[1]);


if(i != 0x1234567) {

printf("Warnning: Buffer Overflow !!! \n");

kill(0, 11);

}

}



풀이

1. 위 소스에는 bof 방어 기법인 canary 기법의 우회를 위한 연습으로 0x1234567을 넣어주고 있다.

따라서, 스택 구조를 확인하여 dummy를 포함한 변수 buf와 변수 i의 크기를 얼만큼 할당했는지 확인하고, 변수 i의 위치에 0x1234567을 넣고 ret주소에 RTL기법을 사용하는쪽으로 접근하면 될 것 같다.

1-1 $ cp attackme ./tmp/attackme

1-2 $ gdb attackme

1-3 (gdb) disas main



위 사진을 보면 0x418 만큼의 공간을 할당하고 있는데, 이는 10진수로 1048이다. 

그렇다면 스택 구조는 다음과 같이 추측해 볼 수 있다.


low address ... | buf[1024] | dummy[20] | i[4] | sfp | ret | ... high address

low address ... | buf[1024] | dummy[4] | i[4] | dummy[16] | sfp | ret | ... high address

low address ... | buf[1024] | dummy[8] | i[4] | dummy[12] | sfp | ret | ... high address

low address ... | buf[1024] | dummy[12] | i[4] | dummy[8] | sfp | ret | ... high address

low address ... | buf[1024] | dummy[16] | i[4] | dummy[4] | sfp | ret | ... high address


위와 같이 추측하고 직접 값을 넣어 보고 스택을 확인하는 것이 확실하지만, 

buf에 쓰레기 값을 넣고 그 뒤에 0x1234567을 6번 연속해서 적어서 canary값을 우회하고 RTL을 사용해도 될 것 같다.





2. RTL기법의 라이브러리 주소들은 이전 13번에서 사용했던 주소를 사용한다.


잘 된 것 같다.