문제 : https://dreamhack.io/wargame/challenges/15
#0과 문제 자체는 같은데, 약간 다른 방식으로 풀어봤다
처음 봤을 때 잘못건들여서 main을 못 찾아서, 아예 Correct를 중심으로 찾아봄
Reversing
* Correct와 같은 문자열들은 어셈블리로 변환된다고 해서 바뀌지 않기 때문에 Sequence of Byte(Alt+B)로 검색해서 찾음
Correct를 볼 수 있다
crtl + x로 이를 가리키는 곳이 어디인지 확인할 수 있다
아마 버퍼에 correct라는 값을 넣는 것으로 추정됨
.text:000000014000137C lea rcx, aInput ; "Input : "
.text:0000000140001383 call sub_1400013E0
.text:0000000140001388 lea rdx, [rsp+20h]
.text:000000014000138D lea rcx, a256s ; "%256s"
.text:0000000140001394 call sub_140001440
.text:0000000140001399 lea rcx, [rsp+20h]
.text:000000014000139E call sub_140001000
.text:00000001400013A3 test eax, eax
.text:00000001400013A5 jz short loc_1400013B6
.text:00000001400013A7 lea rcx, Buffer ; "Correct"
.text:00000001400013AE call cs:puts
.text:00000001400013B4 jmp short near ptr a3
이 부분이 main으로 추정됨
지금 이상하게 IDA가 이 부분에 수도코드로 변경이 안되기 때문에... 그냥 어셈블리로 읽었다
jz가 만족되면 Correct를 안하고 다음으로 넘어가게 된다
즉, jz가 0이면 안되기 때문에 eax (sub_140001000)의 return값이 1이여야한다.
해당 함수의 어셈블리 코드는 이렇게 반복되는데, 글자 하나씩 비교해가며, 주어진 문자와 같으면 다음 문자를 확인하고 아니면 아래 보이는 어셈블리 locret_14000128E로 넘어가 그냥 리턴된다 (1을 리턴하지 않음)
.text:000000014000126F loc_14000126F: ; CODE XREF: sub_140001000+269↑j
.text:000000014000126F mov eax, 1
.text:0000000140001274 imul rax, 15h
.text:0000000140001278 mov rcx, [rsp+arg_0]
.text:000000014000127D movzx eax, byte ptr [rcx+rax]
.text:0000000140001281 test eax, eax
.text:0000000140001283 jz short loc_140001289
.text:0000000140001285 xor eax, eax
.text:0000000140001287 jmp short locret_14000128E
.text:0000000140001289 ; ---------------------------------------------------------------------------
.text:0000000140001289
.text:0000000140001289 loc_140001289: ; CODE XREF: sub_140001000+283↑j
.text:0000000140001289 mov eax, 1
.text:000000014000128E
.text:000000014000128E locret_14000128E: ; CODE XREF: sub_140001000+1E↑j
.text:000000014000128E ; sub_140001000+3C↑j ...
.text:000000014000128E retn
.text:000000014000128E sub_140001000 endp
모든 문자를 비교해서 맞으면 1을 리턴하므로 Correct로 갈 수 있게 된다
IDA 팁
r을 누르면 아스키코드로 되어있던 숫자가 문자로 바뀌어서 보인다
피드백
다른 사람들의 풀이를 조금 참고해보면 대부분 x64디버거를 사용해서 동적분석 했다.
확인하는 부분에 bp를 걸어서 확인할 수도 있을 것 같다.
정적분석에 너무 의존하는 것 같아서 동적분석도 항상 경우의 수를 열어두려고 노력해야할 듯
'Hacking > Wargame' 카테고리의 다른 글
[Reversing] patch (0) | 2024.08.09 |
---|---|
[Cryptography] Textbook-CBC (4) | 2024.08.03 |
[Reversing] Reversing Basic Challenge #0 (2) | 2024.07.28 |
[Pwnable] bof (2) | 2024.07.28 |
[Pwnable] basic_exploitation_001 (0) | 2024.04.03 |