rev-basic-4
์ด ๋ฌธ์ ๋ ์ฌ์ฉ์์๊ฒ ๋ฌธ์์ด ์ ๋ ฅ์ ๋ฐ์ ์ ํด์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ ฅ๊ฐ์ ๊ฒ์ฆํ์ฌ correct ๋๋ wrong์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ด ์ฃผ์ด์ง๋๋ค. ํด๋น ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ์ํ์ฌ correct๋ฅผ ์ถ๋ ฅํ๋ ์ ๋ ฅ๊ฐ์ ์์๋ด์ธ์.
1. ํ๋ก๊ทธ๋จ ๋ถ์
์ฃผ์ด์ง ํ๋ก๊ทธ๋จ์ IDA๋ฅผ ํตํด ๋ถ์์ ์งํํด๋ณด๋ฉด ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ํ์ธํ ์ ์๋ค.
int __fastcall main(int argc, const char **argv, const char **envp)
{
char v4[256]; // [rsp+20h] [rbp-118h] BYREF
memset(v4, 0, sizeof(v4));
sub_1400011C0("Input : ", argv, envp);
sub_140001220("%256s", v4);
if ( (unsigned int)sub_140001000(v4) )
puts("Correct");
else
puts("Wrong");
return 0;
}
์ฌ์ฉ์์ ์
๋ ฅ ๊ฐ์ ๋ฐ์ sub_140001000
ํจ์๋ก ์ ๋ฌํ๋ค.
ํด๋น ํจ์ ์คํ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ Correct
๋๋ Wrong
์ ์ถ๋ ฅํ๋ค.
2. sub_140001000 ํจ์ ๋ถ์
__int64 __fastcall sub_140001000(__int64 a1)
{
int i; // [rsp+0h] [rbp-18h]
for ( i = 0; (unsigned __int64)i < 28; ++i )
{
if ( ((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) | ((int)*(unsigned __int8 *)(a1 + i) >> 4)) != byte_140003000[i] )
return '\0';
}
return '\x01';
}
์ฌ์ฉ์์ ์ ๋ ฅ ๋ฌธ์์ ์ฐ์ฐ์ ์ํํ์ฌ byte_14000300์ ์๋ ๋ฌธ์์ ๋น๊ตํ์ฌ 0 ๋๋ 1์ ๋ฐํํ๋ค.
byte_14000300์ ๋ด๊ฒจ์๋ ๊ฐ์ ์๋์ ๊ฐ๋ค.
3. ์กฐ๊ฑด ๋ถ์
if๋ฌธ์์ ์กฐ๊ฑด์ ๋ถ์ํด๋ณด๋ฉด ์๋์ ๊ฐ์ ํํ์ด๋ค.
16 * a1[i] | a1[i] >> 4 == byte_14000300[i]
ํด๋น ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ์ ์ฐพ๊ธฐ ์ํด ์๋ํด๋ดค์ง๋ง ๊ฒฐ๊ณผ ๊ฐ์ด ๋์ค์ง ์์๋ค.
IDA์์ Pseudo Code๋ฅผ ํตํด ํ์ธํ ์กฐ๊ฑด์ ์์ ๊ฐ์ง๋ง ์ค์ Assembly๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
movsxd rax, [rsp+18h+var_18]
mov rcx, [rsp+18h+arg_0]
movzx eax, byte ptr [rcx+rax]
sar eax, 4
movsxd rcx, [rsp+18h+var_18]
mov rdx, [rsp+18h+arg_0]
movzx ecx, byte ptr [rdx+rcx]
shl ecx, 4
and ecx, 0F0h
or eax, ecx
movsxd rcx, [rsp+18h+var_18]
lea rdx, byte_140003000
movzx ecx, byte ptr [rdx+rcx]
cmp eax, ecx
jz short loc_140001063
Assembly๋ก ํ์ธํ ์กฐ๊ฑด์ ์๋์ ๊ฐ๋ค.
a[i] << 4 & 0xF0 | a1[i] >> 4
4. Exploit
ํด๋น ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ์ ์ฐพ๋ ๊ฐ์ ascii ๊ฐ ๋ด ์์ ๋ฌด์์ ๋์ ์ ์งํํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ฌ Flag๋ฅผ ์ฐพ๋๋ค.
#python3 ex.py
#byte_140003000 DATA
x = "36, 39, 19, 198, 198, 19, 22, 230, 71, 245, 38, 150, 71, 245, 70, 39, 19, 38, 38 , 198, 86, 245, 195, 195, 245, 227, 227, 0".replace(" ","").split(",")
flag = []
for j in x:
for i in range(0,127):
lshift = int(i) << 4 & 0xF0
rshift = int(i) >> 4
result = rshift | lshift
if(result == int(j)):
flag.append(chr(i))
print("flag : "+"DH{"+"".join(flag)+"}")
'๐ก๏ธCTF > DreamHack' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Secure Mail (0) | 2024.01.03 |
---|---|
Shell_Basic (0) | 2023.10.08 |
rev-basic-3 (0) | 2023.09.19 |
[BOB CTF 8th] - FileStroage (0) | 2022.09.13 |
[BOB CTF 8th] - Summer Fan (0) | 2022.09.13 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
Secure Mail
Secure Mail
2024.01.03 -
Shell_Basic
Shell_Basic
2023.10.08 -
rev-basic-3
rev-basic-3
2023.09.19 -
[BOB CTF 8th] - FileStroage
[BOB CTF 8th] - FileStroage
2022.09.13