redpwnCTF 2021의 리버싱 문제 wstrings다. 너무 쉽게 풀려서 조금 허무했던 문제다.
문제 파일로 바이너리가 주어져 있다.
문제 파일을 실행해보면 Welcome to flag checker 1.0. 문구와 flag를 달라는 문구가 출력된 후 입력을 받는다. 입력을 받고 바로 종료되는데, 예상을 해보면 올바른 flag를 찾아 입력하면 correct 같은 성공 문자열이 뜰 것 같으니, flag 값과 입력 값을 비교하는 로직을 분석하여 flag 값을 알아내면 될 것 같다.
ida로 확인해본 wstrings 바이너리의 main 함수다. wprintf 함수를 통해 "Welcome to flag checker 1.0.
Give me a flag> " 문구를 출력하고 fgetsws 함수를 통해 wchar 자료형으로 입력을 받는 것 같다. 혹시나 입력 받는 변수의 크기를 확인해봤는데 역시 bof는 일어나지 않았다. 포너블 관점 on
wcscmp 함수로 wchar 형태인 입력 값과 flag 값을 비교한 뒤 같다면 무언가를 출력해주고 틀리다면 그냥 종료해준다.
어떠한 로직도 없이 그냥 입력 값과 flag 값을 비교하길래 당황해서 flag 값을 확인하려고 data 섹션으로 갔다.
flag(변수)가 존재하는 data 섹션에는 unk_938의 주소가 저장돼 있었다.
unk_938이 있는 rodata section으로 넘어가니 flag 값이 있었다. 특이하게 문자+\x00*3 형식으로 값이 이루어져 있었다. char가 아닌 wschar 형태라 그런 것 같다.
전체 값...
.rodata:0000000000000938 unk_938 db 66h ; f ; DATA XREF: .data:flago
.rodata:0000000000000939 db 0
.rodata:000000000000093A db 0
.rodata:000000000000093B db 0
.rodata:000000000000093C db 6Ch ; l
.rodata:000000000000093D db 0
.rodata:000000000000093E db 0
.rodata:000000000000093F db 0
.rodata:0000000000000940 db 61h ; a
.rodata:0000000000000941 db 0
.rodata:0000000000000942 db 0
.rodata:0000000000000943 db 0
.rodata:0000000000000944 db 67h ; g
.rodata:0000000000000945 db 0
.rodata:0000000000000946 db 0
.rodata:0000000000000947 db 0
.rodata:0000000000000948 db 7Bh ; {
.rodata:0000000000000949 db 0
.rodata:000000000000094A db 0
.rodata:000000000000094B db 0
.rodata:000000000000094C db 6Eh ; n
.rodata:000000000000094D db 0
.rodata:000000000000094E db 0
.rodata:000000000000094F db 0
.rodata:0000000000000950 db 30h ; 0
.rodata:0000000000000951 db 0
.rodata:0000000000000952 db 0
.rodata:0000000000000953 db 0
.rodata:0000000000000954 db 74h ; t
.rodata:0000000000000955 db 0
.rodata:0000000000000956 db 0
.rodata:0000000000000957 db 0
.rodata:0000000000000958 db 5Fh ; _
.rodata:0000000000000959 db 0
.rodata:000000000000095A db 0
.rodata:000000000000095B db 0
.rodata:000000000000095C db 61h ; a
.rodata:000000000000095D db 0
.rodata:000000000000095E db 0
.rodata:000000000000095F db 0
.rodata:0000000000000960 db 6Ch ; l
.rodata:0000000000000961 db 0
.rodata:0000000000000962 db 0
.rodata:0000000000000963 db 0
.rodata:0000000000000964 db 31h ; 1
.rodata:0000000000000965 db 0
.rodata:0000000000000966 db 0
.rodata:0000000000000967 db 0
.rodata:0000000000000968 db 5Fh ; _
.rodata:0000000000000969 db 0
.rodata:000000000000096A db 0
.rodata:000000000000096B db 0
.rodata:000000000000096C db 73h ; s
.rodata:000000000000096D db 0
.rodata:000000000000096E db 0
.rodata:000000000000096F db 0
.rodata:0000000000000970 db 74h ; t
.rodata:0000000000000971 db 0
.rodata:0000000000000972 db 0
.rodata:0000000000000973 db 0
.rodata:0000000000000974 db 72h ; r
.rodata:0000000000000975 db 0
.rodata:0000000000000976 db 0
.rodata:0000000000000977 db 0
.rodata:0000000000000978 db 31h ; 1
.rodata:0000000000000979 db 0
.rodata:000000000000097A db 0
.rodata:000000000000097B db 0
.rodata:000000000000097C db 6Eh ; n
.rodata:000000000000097D db 0
.rodata:000000000000097E db 0
.rodata:000000000000097F db 0
.rodata:0000000000000980 db 67h ; g
.rodata:0000000000000981 db 0
.rodata:0000000000000982 db 0
.rodata:0000000000000983 db 0
.rodata:0000000000000984 db 73h ; s
.rodata:0000000000000985 db 0
.rodata:0000000000000986 db 0
.rodata:0000000000000987 db 0
.rodata:0000000000000988 db 5Fh ; _
.rodata:0000000000000989 db 0
.rodata:000000000000098A db 0
.rodata:000000000000098B db 0
.rodata:000000000000098C db 61h ; a
.rodata:000000000000098D db 0
.rodata:000000000000098E db 0
.rodata:000000000000098F db 0
.rodata:0000000000000990 db 72h ; r
.rodata:0000000000000991 db 0
.rodata:0000000000000992 db 0
.rodata:0000000000000993 db 0
.rodata:0000000000000994 db 33h ; 3
.rodata:0000000000000995 db 0
.rodata:0000000000000996 db 0
.rodata:0000000000000997 db 0
.rodata:0000000000000998 db 5Fh ; _
.rodata:0000000000000999 db 0
.rodata:000000000000099A db 0
.rodata:000000000000099B db 0
.rodata:000000000000099C db 73h ; s
.rodata:000000000000099D db 0
.rodata:000000000000099E db 0
.rodata:000000000000099F db 0
.rodata:00000000000009A0 db 6Bh ; k
.rodata:00000000000009A1 db 0
.rodata:00000000000009A2 db 0
.rodata:00000000000009A3 db 0
.rodata:00000000000009A4 db 31h ; 1
.rodata:00000000000009A5 db 0
.rodata:00000000000009A6 db 0
.rodata:00000000000009A7 db 0
.rodata:00000000000009A8 db 6Eh ; n
.rodata:00000000000009A9 db 0
.rodata:00000000000009AA db 0
.rodata:00000000000009AB db 0
.rodata:00000000000009AC db 6Eh ; n
.rodata:00000000000009AD db 0
.rodata:00000000000009AE db 0
.rodata:00000000000009AF db 0
.rodata:00000000000009B0 db 79h ; y
.rodata:00000000000009B1 db 0
.rodata:00000000000009B2 db 0
.rodata:00000000000009B3 db 0
.rodata:00000000000009B4 db 7Dh ; }
.rodata:00000000000009B5 db 0
.rodata:00000000000009B6 db 0
.rodata:00000000000009B7 db 0
.rodata:00000000000009B8 db 0
.rodata:00000000000009B9 db 0
.rodata:00000000000009BA db 0
.rodata:00000000000009BB db 0
.rodata:00000000000009BC db 0
어쨌든 저 문자들을 모두 연결하면 flag 값이 나온다.
flag{n0t_al1_str1ngs_ar3_sk1nny}
'CTF' 카테고리의 다른 글
CSAW CTF 2021 Write up (0) | 2021.09.13 |
---|---|
RTLxHA CTF 21 write up (0) | 2021.08.02 |
[redpwnCTF 2021] pwn - ret2generic-flag-reader (0) | 2021.07.13 |
[redpwnCTF 2021] pwn - beginner-generic-pwn-number-0 (0) | 2021.07.13 |
[redpwnCTF 2021] misc problems (0) | 2021.07.12 |