<문제>
What does asm2(0xb,0x2e) return? Submit the flag as a hexadecimal value (starting with '0x'). NOTE: Your submission for this question will NOT be in the normal flag format. Source
asm2:
<+0>: push ebp
<+1>: mov ebp,esp
<+3>: sub esp,0x10
<+6>: mov eax,DWORD PTR [ebp+0xc]
<+9>: mov DWORD PTR [ebp-0x4],eax
<+12>: mov eax,DWORD PTR [ebp+0x8]
<+15>: mov DWORD PTR [ebp-0x8],eax
<+18>: jmp 0x509 <asm2+28>
<+20>: add DWORD PTR [ebp-0x4],0x1
<+24>: sub DWORD PTR [ebp-0x8],0xffffff80
<+28>: cmp DWORD PTR [ebp-0x8],0x63f3
<+35>: jle 0x501 <asm2+20>
<+37>: mov eax,DWORD PTR [ebp-0x4]
<+40>: leave
<+41>: ret
주어진 코드는 위와 같고, 인자는 0xb, 0x2e로, <+15>까지의 코드를 보고 스택 모양을 정리하면
같이 될거고, <+28>로 가서 현재 [ebp-0x8]에 위치한 값과 0x63f3을 비교해 왼쪽값 즉, [ebp-0x8]에 위치한 값이 크면 반복문을 빠져나가게 되어있다. 그 전까진 [ebp-0x8](0xb) 값에 0xffffff80만큼 빼고, [ebp-0x4](0x2e) 값에 1씩 더하는 걸 반복한다. 마지막으로 정답은 반복문을 빠져나와서의 [ebp-0x4] 값이 될것이다.
정답값을 구하기 위해 C++로 코드 (a: [ebp-0x4], b: [ebp-0x8])
#include <iostream>
using namespace std;
int main() {
int a = 0x2e;
int b = 0xb;
while (1) {
b -= 0xffffff80;
a += 1;
if (b > 0x63f3) break;
}
cout << "a : " << hex << a << endl << "b : " << hex << b << endl;
}
정답은 0xf6 !
(flag 형식은 이전과 다르다고 했으므로 정답값만 입력)
FLAG : 0xf6
'CTF > Reversing' 카테고리의 다른 글
[picoCTF] droids0 (0) | 2021.01.12 |
---|---|
[picoCTF] OTP Implementation (0) | 2021.01.12 |
[picoCTF] vault-door 4 (0) | 2021.01.10 |
[Hitcon2020] Welcome (0) | 2020.11.30 |
[BalsnCTF2020] babyrev (0) | 2020.11.29 |