포너블(18)
-
x64 Simple_size_BOF 풀이
char형에 크기 6D30(10진수로 27,952)인 배열 v4를 선언합니다. 그리고 s를 출력합니다. main함수 안에는 s가 선언되지 않은걸 보니 전역 변수로서 bss영역에 있을 것 같네요. 그리고 v4의 주소값을 출력해준 뒤에 v4를 입력받습니다. 이렇게만 봐서는 s가 무엇을 하는 변수인지 잘 모르겠으니 직접 실행파일을 실행시켜보겠습니다. s는 필요없는 변수였습니다. 이제 어떻게 문제를 풀지 생각해보겠습니다. 먼저 v4에 쉘코드를 집어넣고 그 뒤에 있는 buf 영역은 쓰레기 값으로 채우고, sfp(long long이니까 8byte)도 쓰레기 값으로 채워줍니다. 그 뒤에 있는 ret 부분에는 아까 printf에서 출력한 buf 주소를 가져다 넣으면 쉘코드가 실행될 것 같습니다. from pwn imp..
2021.07.13 -
내 버퍼가 흘러넘친다!!! 풀이
우선 char형 배열 s를 선언합니다. s의 크기는 0x14(10진수로 20)입니다. 그리고 read 함수로 0x32(10진수로 50) 크기의 name을 입력받는데... 저 name은 main 안에 없는거 보면 아마 전역 변수인 것 같습니다. 그리고 gets 함수로 s를 입력받습니다. 일단 name, s 둘 다 오버플로우의 가능성은 있어보입니다. 우선 입력받는 순서대로 name을 먼저 보고, 그다음 s를 보겠습니다. name을 전역 변수라고 생각하고 Shift+F7로 bss 영역을 열어봤습니다. IDA 쓰시는 다른 분들 블로그 보니 단축키가 아주 잘 정리돼있더라고요...ㅎㅎ 감사합니다 역시나 bss영역에 name이 있었습니다. name의 주소는 0x804A060이라고 나와있습니다. 기본적인 정보 수집은 ..
2021.07.12 -
basic_exploitation_000 풀이
#include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main(int argc, char *argv[]) { char buf[0x80]; initialize(); printf("buf = (%p)\n", buf); scanf("%141s", buf); return 0; } basic_exploitation_000.c 파일의 소스코드입니다. main문부터 차근차근..
2021.07.11 -
x64 Buffer Overflow 풀이
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(..
2021.06.16 -
Basic_BOF #2 풀이
이 문제도 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 함수 포인터가 ..
2021.06.16 -
Basic_BOF #1 풀이
문제 파일인 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..
2021.06.15