rev-basic-3
์ด ๋ฌธ์ ๋ ์ฌ์ฉ์์๊ฒ ๋ฌธ์์ด ์ ๋ ฅ์ ๋ฐ์ ์ ํด์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ ฅ๊ฐ์ ๊ฒ์ฆํ์ฌ 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_1400011B0("Input : ", argv, envp);
sub_140001210("%256s", v4);
if ( (unsigned int)sub_140001000((__int64)v4) )
puts("Correct");
else
puts("Wrong");
return 0;
}
v4 ๋ณ์์ 256๋ฐ์ดํธ์ char ํ์
์ ์์ฑํ๊ณ ๊ฐ์ ์
๋ ฅ ๋ฐ๋๋ค. ์ดํ 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 < 24; ++i )
{
if ( byte_140003000[i] != (i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i )
return 0i64;
}
return 1i64;
}
byte_140003000์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ ๊ฐ๊ณผ ์ฌ์ฉ์ ์ ๋ ฅ ๊ฐ์ xor ํ ๊ฐ๊ณผ 2 * i ๊ฐ์ ๋ํ ๊ฐ๊ณผ ๊ฐ์์ง ๋น๊ตํ๋ ๋ฐ๋ณต๋ฌธ์ด ์กด์ฌํ๋ค.
๋จผ์ byte_140003000์ ๊ฐ์ ํ์ธํด๋ณด๋ฉด ์๋ ๊ฐ์ผ๋ก ํ์ธ๋๋ค.
[+] 2 dup(105) ?
duplicate์ ์ฝ์ด๋ก ์ค๋ณต๋ ๊ฐ์ dup๋ก ํ์ํด์ค๋ค. 2 dup(105)๋ 105์ ๊ฐ์ 2๋ฒ ๋ฐ๋ณตํ๋ค๋ ์๋ฏธ์ด๋ค.
๋ฐ๋ณต๋ฌธ์ด ์งํ๋๋ฉฐ ๊ฐ ๋ฐ์ดํธ ๊ฐ๊ณผ ์ฌ์ฉ์ ์
๋ ฅ ๊ฐ์ ๋ฐ์ดํธ์ ๋ฐ๋ณต๋ฌธ์ด ์งํ๋จ์ ๋ฐ๋ผ ์ฆ๊ฐํ๋ i ๊ฐ๊ณผ 2 * i ๊ฐ์ ๋ํ์ฌ ๋น๊ตํ๋ค.
3. ์กฐ๊ฑด ๋ถ์
AAA๋ฅผ ์ ๋ ฅ๊ฐ์ผ๋ก ๊ฐ์ ํ๊ณ ์ฒซ ๋ฐ๋ณต๋ฌธ์ ์์ ์กฐ๊ฑด์ ์ ๋ฆฌํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค
73 != (0 ^ 0x65) + 2 * 0
๋ฌธ์ ํ๋ฆ์ ๋ณด๋ฉด ์ ๋ ฅํ๋ ๊ฐ์ด FLAG์ผ๊ฒ์ผ๋ก ์ถ์ธก๋๋ค.
XOR ์ฐ์ฐ์ ํน์ฑ์ ์ด์ฉํ์ฌ ์ ๋ ฅํด์ผํ๋ ๊ฐ์ ๊ณ์ฐํ ์ ์๋ค.
[+] XOR ์ฐ์ฐ์ ํน์ฑ
- ๋ ๊ฐ์ ๊ฐ ์๋ฆฟ์๋ฅผ ๋น๊ตํด, ๊ฐ์ด ๊ฐ์ผ๋ฉด 0, ๋ค๋ฅด๋ฉด 1์ ์ถ๋ ฅํ๋ค.
-A ^ B = C ์ด๋ฉด A ^ C = B ์ด๊ณ B ^ C = A ์ด๋ค.
ํด๋น ํน์ฑ์ ์ด์ฉํด ์๋์ ์์ ๋์ถํ๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ๊ณ์ฐํ๋ค.
FLAG[i] = byte_140003000[i] - (2 * i)
FLAG[i] = i ^ FLAG[i]
4. Exploit
#rev-basic-3 python exploit
#byte_140003000 DATA
x = "49, 60, 67, 74, 63, 67, 42, 66, 80, 78, 69, 69, 7B, 99, 6D, 88, 68, 94, 9F, 8D, 4D, A5, 9D ,45".replace(" ","").split(",")
flag = []
for i in range(0,24):
v = int(x[i],16) - (2*i)
v = i ^ v
flag.append(chr(v))
print("flag : "+"DH{"+"".join(flag)+"}")
'๐ก๏ธCTF > DreamHack' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Shell_Basic (0) | 2023.10.08 |
---|---|
rev-basic-4 (0) | 2023.09.28 |
[BOB CTF 8th] - FileStroage (0) | 2022.09.13 |
[BOB CTF 8th] - Summer Fan (0) | 2022.09.13 |
Apache htaccess (0) | 2022.07.28 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
Shell_Basic
Shell_Basic
2023.10.08 -
rev-basic-4
rev-basic-4
2023.09.28 -
[BOB CTF 8th] - FileStroage
[BOB CTF 8th] - FileStroage
2022.09.13 -
[BOB CTF 8th] - Summer Fan
[BOB CTF 8th] - Summer Fan
2022.09.13