-
note write upSystem hacking training/pwnable.xyz 2020. 1. 10. 20:03
다소 easy한 문제다.
이젠 32bit 바이너리가 나오면 신기할것 같다.
역시 64bit 바이너리, Canary와 NX만 활성화 되어있다.
main()함수를 보면 while로 무한루프를 돌며 read_int32()함수의 return값에 따라 edit_note(), edit_desc()함수가 호출된다.
print_menu()함수는 단순하게 루프 한번 돌때마다 menu를 출력해주는 역할을 하고
read_int32()함수는 read()함수로 32byte 입력받은 뒤 atoi()함수로 char to int변환을 해주며 return하는 함수다.
(즉 char형으로 32byte 받고 int형으로 return해주는 함수!)
해당 return값은 main()함수에서 menu를 고를 때 사용되고
menu 1을 선택할 경우 edit_note()함수를 호출한다.
edit_note()함수는 read_int32()함수로 동적할당할 size를 입력받고 할당한 위치에 값을 입력받는다.
또한 strncpy()함수로 전역변수 s에 값복사를 진행한뒤 free()한다.
여기서 s는 32byte로 선언되어있고 앞선 strncpy()함수에서 사용자가 지정한 size만큼 buf에서 값을 읽어와 복사하기 때문에 s[32] 이후 입력이 가능하다. (할당된 s의 크기 보다 더 많은 영역에 값을 쓸 수 있다.)
다음으로 2를 입력했을 때 edit_desc()함수가 호출되는데,
해당 함수는 buf라는 전역 변수가 0이 아닐때 malloc()함수를 호출하여 0x20만큼 동적할당 하고 해당 위치에 0x20byte만큼 입력을 받으며 함수가 종료된다.
문제가 되는 곳은 여러가지가 있다.
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()함수가 있다.
따라서
다음과 같이 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{--------------------------------------}$
반응형'System hacking training > pwnable.xyz' 카테고리의 다른 글
two targets write up (0) 2020.02.06 xor write up (0) 2020.02.05 GrownUp write up (0) 2020.01.02 misalignment write up (0) 2020.01.01 add write up (0) 2020.01.01