unsigned __int64 __fastcall sub_1437(char *a1)
{
int v2; // eax
unsigned int v4; // [rsp+18h] [rbp-38h]
int i; // [rsp+1Ch] [rbp-34h]
const char *s1; // [rsp+20h] [rbp-30h]
char *v7; // [rsp+28h] [rbp-28h]
char s2[5]; // [rsp+33h] [rbp-1Dh] BYREF
unsigned __int64 v9; // [rsp+38h] [rbp-18h]
v9 = __readfsqword(0x28u);
v4 = 0;
a1[strcspn(a1, "\n")] = 0;
s1 = strtok(a1, " ");
while ( s1 )
{
if ( !strcmp(s1, "print") )
return (unsigned __int64)v4 << 32;
if ( !strcmp(s1, "id") )
return ((unsigned __int64)v4 << 32) | 1;
if ( !strcmp(s1, "help") )
return ((unsigned __int64)v4 << 32) | 2;
v7 = strdup(s1);
for ( i = 0; v7[i]; ++i )
{
v2 = i;
v7[v2] ^= 0x42u;
}
strcpy(s2, "&-17");
if ( strcmp(v7, s2) )
{
free(v7);
return ((unsigned __int64)v4 << 32) | 0xFFFFFFFF;
}
v4 = 1;
s1 = strtok(0LL, " ");
free(v7);
}
return ((unsigned __int64)v4 << 32) | 0xFFFFFFFF;
}
- sub_1437 ํจ์์์ s์์ strtok ํจ์๋ก ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ฌธ์์ด์ ์ฒ๋ฆฌํจ.
- print, id, help๊ฐ ์๋ ๋, ์
๋ ฅ ๋ฌธ์์ด์ ๊ฐ ๋ฌธ์^0x42 ๊ฒฐ๊ณผ๊ฐ "&-17"๊ณผ ๋์ผํ ๊ฒฝ์ฐ v4=1๋ก ์ค์ ๋จ.
void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{
__int64 v3; // rax
char s[72]; // [rsp+10h] [rbp-50h] BYREF
unsigned __int64 v5; // [rsp+58h] [rbp-8h]
v5 = __readfsqword(0x28u);
sub_13A9(a1, a2, a3);
sub_140E();
while ( 1 )
{
while ( 1 )
{
printf("> ");
fgets(s, 64, stdin);
v3 = sub_1437(s);
if ( (_DWORD)v3 != 2 )
break;
sub_1749();
}
if ( (int)v3 > 2 )
{
LABEL_10:
puts("Invalid Command!");
}
else if ( (_DWORD)v3 )
{
if ( (_DWORD)v3 != 1 )
goto LABEL_10;
sub_1711(HIDWORD(v3));
}
else
{
sub_1673(HIDWORD(v3));
}
}
}
- ์ดํ main ํจ์๋ฅผ ๋ณด๋ฉด 2์ธ ๊ฒฝ์ฐ์ ์ถ๋ ฅ์, 2 ์ด์์ธ ๊ฒฝ์ฐ Invalid Command๋ฅผ, 1์ธ ๊ฒฝ์ฐ id๋ฅผ ์ถ๋ ฅํจ. ์ด์ธ์ ๊ฒฝ์ฐ์, ์๋ฅผ ๋ค๋ฉด 0์ธ ๊ฒฝ์ฐ์ sub_1673 ํจ์๋ก ๋ถ๊ธฐํจ
int __fastcall sub_1673(int a1)
{
const char *v1; // rax
char i; // al
FILE *stream; // [rsp+48h] [rbp-8h]
if ( a1 )
v1 = "./flag";
else
v1 = "./art";
stream = fopen(v1, "r");
for ( i = getc(stream); i != -1; i = getc(stream) )
putchar(i);
fclose(stream);
return putchar(10);
}
- ์ด๋ ์ฐธ์ด๋ฉด flag๋ฅผ, ์๋๋ฉด art๋ฅผ ์ถ๋ ฅํจ. ๋ฐ๋ผ์ ํ๋๊ทธ ํจ์๋ก ์ง์
ํ๋ค ํด๋ 0์ด๋ฉด ํ๋๊ทธ๋ฅผ ์ถ๋ ฅํ์ง ๋ชปํจ(์
๋ ฅ ์ฒ๋ฆฌ์์ ๊ทธ๋ฅ v4=0์ธ ์ํ์์ print๋ฅผ ์ฃผ๋ ๊ฒฝ์ฐ)
- ์กฐ๊ฑด์ ๋ง์กฑํ๊ธฐ ์ํด v7^0x42๋ฅผ ๊ตฌํด์ v4=1(0x0000000000000001)๋ก ๋ง๋ค๊ณ , ์ดํ print๋ก ์ธํด 1<<32๋ฅผ ํ๋ฉด
0x0000000100000000์ด ๋์ด ํ๋๊ทธ ํจ์๋ก์ ๋ถ๊ธฐ ์กฐ๊ฑด๊ณผ(ํ์๊ฐ 0์ด๋ฏ๋ก) ํ๋๊ทธ ์ถ๋ ฅ ์กฐ๊ฑด(์์ 4๋ฐ์ดํธ๊ฐ 1์)์ ๋ง์กฑํ์ฌ ํ๋๊ทธ๊ฐ ์ถ๋ ฅ๋จ
์ต์คํ๋ก์ ์ฝ๋
from pwn import *
context.log_level='debug'
p = remote('host3.dreamhack.games',21849)
target="&-17"
v7=''.join(chr(ord(c) ^ 0x42) for c in target)
print(f'v7: {v7}')
p.sendlineafter(b'>', v7+" "+"print")
p.interactive()
[Dreamhack] rev-basic-2 (0) | 2021.03.15 |
---|---|
[Dreamhack] rev-basic-1 (0) | 2021.03.15 |
[Dreamhack] rev-basic-0 (0) | 2021.03.15 |