이번 문제는 "컴파일러 경고를 누가 신경쓸까?" 라는 내용의 문제네요..

컴파일러 경고가 힌트인가봅니다.


소스코드를 자세히 살펴보면 scanf에 &가 없습니다. 여기서 compiler warning이 떴겠네요. 저 부분에서 문제를 해결 해보도록 하겠습니다.


하라는대로 했는데 seg fault에러가 뜹니다.

먼저 scanf 사용시 대상 변수가 char로 선언되어 있는 경우 초기 값은 주소와 동일하기 때문에 ‘&’ 없이 그냥 사용해도 됩니다. 반면 int로 선언되어 있는 경우 ‘&’ 없이 사용하면 변수자체가 주소가 되며 그 주소에 입력한 값이 들어갑니다.

그리고 리눅스에서 fflush의 인자로 표준 입력이 들어 오면 아무런 동작을 하지 않는다고 합니다.

즉, 리눅스에서는 fflush에 의해 ‘\n’이 버퍼에서 비워지지 않기 때문에 다음과 같이 프로그램을 실행하면 passcode1=338150, passcode2=’\n’이 됩니다.

welcome() 함수의 name은 ebp-0x70에 위치합니다. 100글자를 입력할 수 있습니다.


login()함수의 passcode1은  $ebp-0x10에 위치합니다. 0x70-0x10=0x60=96 이므로 총 4바이트를 조작할 수 있습니다. 

따라서 fflsuh의 GOT를 조작하여 system(“/bin/cat flag”)로 이동시키면 문제가 풀립니다.

("A"*96+exit@got) 값으로 name을 채우고 passcode에 system(“/bin/cat flag”) 주소를 주면 됩니다.


먼저 exit 함수의 주소는 readelf로 확인합니다.


exit => 0x0804a018


system("/bin/cat flag")의 주소는 gdb로 확인합니다.

=> 0x080485e3

이것을 10진수로 변환해서 입력해줍니다. 

그리고 seg fault가 발생하는것을 막기위해 passcode2에 문자를 입력하면 됩니다.


(python -c 'print "A"*96+"\x18\xa0\x04\x08"+"134514147\n"+"a\n"';cat) | ./passcode


flag가 나왔습니다. 

정말 어렵네요..


'Wargame > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] mistake 1p  (0) 2016.08.19
[pwnable.kr] uaf 8p  (0) 2016.08.15
[pnwable.kr] random 1pt  (0) 2016.07.29
[pwnable.kr 2번] collision 3pt  (0) 2016.07.27
[pwanble.kr 1번] fd 1pt  (0) 2016.07.27

+ Recent posts