-
note write upSystem hacking training/pwnable.xyz 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{--------------------------------------}$
반응형'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