[pwnable.kr] passcode - 10pt

해킹대회 문제 풀이 연습장소

Moderator: amesianx

Post Reply
gee8195
Posts: 34
Joined: Thu Jul 21, 2016 5:12 pm

[pwnable.kr] passcode - 10pt

Post by gee8195 » Wed Sep 21, 2016 11:23 pm

후... 이번문제 꽤나 머리아팠습니다 ㅠㅠ
1.png
1.png (20.14 KiB) Viewed 321 times
일단 접속하는 화면을 보면 컴파일시에 에러가났지만 누가 신경쓰겠냐는 힌트가 있습니다.
그럼 소스를 한번 보겠습니다.
2.png
2.png (57.91 KiB) Viewed 321 times
3.png
3.png (34.64 KiB) Viewed 320 times
컴파일시에 에러가 난다 했으니 해당 소스로 리눅스 환경에서 컴파일 해봤습니다.
일단 에러를 보니 scanf()사용시에 &(주소연산자)를 빠트렸군요... 주소연산자는 해당 변수의 주소를 얻는 역할을 하는데,이를
빠트리면 입력한 값이 주소가 될수가 있습니다.
한가지 오류가 더 있는데 리눅스 환경에서 fflush(stdin)은 제 기능을 하지 못합니다.
리눅스에서는 __fpurge(stdin)를 사용해야한다는걸 배웠습니다
5.png
5.png (29.97 KiB) Viewed 321 times
6.png
6.png (24.03 KiB) Viewed 321 times
name에는 100글자를 입력할 수 있는데, name은 ebp-70에 위치하고, passcode1은 ebp-10에 위치합니다.
이를 계산하면 96라는 결과가 나오므로, 남은 4byte의 공간을 이용할 수 있습니다. 이를 이용해서 passcode1의 초기값을 조작할 수 있습니다.
그값을 조작하기 위해서 plt 와 got의 개념에 대해 알아봤습니다. 개념에 대해서 적으면...

PLT(Procedure Linkage Table) :got으로 점프하는 코드가 저장되있는 테이블
GOT(Global Offset Table):실제 함수주소들이 저장되있는 테이블

함수를 처음 호출시
==>함수 호출
==>plt로 이동
==>got을 참조
==>plt로 이동
==>_dl_runtime_resolve
==>got에 실제주소 저장후, 이동

함수호출이 처음이 아닐시
==>함수 호출
==>plt로 이동
==>got참조
==>실제 주소로 점프

이렇게 설명할수 있습니다... _dl_runtime_resolve함수는 실제함수의 주소를 계산하고 got에 저장한뒤, 실제 함수 주소로 점프하는 기능을 합니다.
결국 실제 함수주소가 있는 got의 주소를 사용하면 되겠습니다.

4.png
4.png (10.07 KiB) Viewed 321 times
7.png
7.png (44.13 KiB) Viewed 321 times
got은 fflush@got의 주소를 사용하고, 점프할 주소는 if조건문을 통과한 바로 다음 주소를 사용하겠습니다. 여기서 점프할 주소는 passcode1을 이용할 것이기에 정수형으로 선언 되어 있으므로, 주소를 정수형태로 입력하겠습니다.
8.png
8.png (23.53 KiB) Viewed 321 times
0x080485d7 == 134514135
payload = (python -c 'print "A"*96+"\x04\xa0\x04\x08"+"134514135"';cat)|./passcode
플래그가 출력됬습니다.후~ 정말 머리 아픈문제였습니다 ㅠ.ㅠ
혹시 제가 개념 잘못이해한거 있으면 알려주시면 감사하겠습니다 ㅠㅠ

Post Reply

Who is online

Users browsing this forum: No registered users and 17 guests