fkillrra 2020. 1. 10. 20:03

note (50)

다소 easy한 문제다.

 

prob
file, checkec

이젠 32bit 바이너리가 나오면 신기할것 같다.

역시 64bit 바이너리, Canary와 NX만 활성화 되어있다.

 

IDA-View main()

main()함수를 보면 while로 무한루프를 돌며 read_int32()함수의 return값에 따라 edit_note(), edit_desc()함수가 호출된다.

 

IDA-View print_menu()

print_menu()함수는 단순하게 루프 한번 돌때마다 menu를 출력해주는 역할을 하고

 

IDA-View read_int32()

read_int32()함수는 read()함수로 32byte 입력받은 뒤 atoi()함수로 char to int변환을 해주며 return하는 함수다.

(즉 char형으로 32byte 받고 int형으로 return해주는 함수!)

 

해당 return값은 main()함수에서 menu를 고를 때 사용되고

 

IDA-View edit_note()

menu 1을 선택할 경우 edit_note()함수를 호출한다.

edit_note()함수는 read_int32()함수로 동적할당할 size를 입력받고 할당한 위치에 값을 입력받는다.

 

또한 strncpy()함수로 전역변수 s에 값복사를 진행한뒤 free()한다.

 

IDA-View char s[32]

여기서 s는 32byte로 선언되어있고 앞선 strncpy()함수에서 사용자가 지정한 size만큼 buf에서 값을 읽어와 복사하기 때문에 s[32] 이후 입력이 가능하다. (할당된 s의 크기 보다 더 많은 영역에 값을 쓸 수 있다.)

 

IDA-View edit_desc()

다음으로 2를 입력했을 때 edit_desc()함수가 호출되는데,

해당 함수는 buf라는 전역 변수가 0이 아닐때 malloc()함수를 호출하여 0x20만큼 동적할당 하고 해당 위치에 0x20byte만큼 입력을 받으며 함수가 종료된다.

 

s[32] - buf : 32

문제가 되는 곳은 여러가지가 있다.

1. 먼저 전역으로 선언되어있는 s와 buf가 인접해있다.

2. edit_note()함수에서 size조절이 가능하기 때문에 s[32]보다 더 많은 영역에 값을 쓸 수 있다.

3. edit_desc()함수에서 buf가 0일때만 malloc()함수를 호출하여 동적할당 한다.

 

따라서 edit_note()함수를 이용하여 s[32] + 8의 위치 즉 buf의 위치에 접근하여 값을 쓸 수 있고, (got)

edit_desc()함수에서 buf가 가리키는 주소에 사용자 입력으로 덮어쓸 수 있다. (overwrite)

 

그리고 익스를 도와주는 win()함수가 있다.

 

IDA-View win()

따라서

 

payload

다음과 같이 payload를 작성하여 flag를 출력할 수 있다.

 

⚡ root@ubuntu  /mnt/hgfs/vm_shared/pwnable.xyz  python a.py
[+] Opening connection to svc.pwnable.xyz on port 30016: Done
[*] Switching to interactive mode
FLAG{--------------------------------------}$
반응형