본문 바로가기

CTF

(51)
Pwnable.tw pwnable_start Write up 간단한 문제라고 설명하지만 나한텐 절대 간단하지 않았다. 일단 바이너리 하나가 주어진다. 이 바이너리 가지고 한번 분석해보자. 일단 Ida로 열어보면 main 함수를 받고있지 않다. 근데 실행은된다. 즉 _start에서 출력이랑 인풋을 처리한다는얘기이다. 디스어셈블리로 코드를 한번 봐보자. ㅇ push esp push offset _exit xor eax, eax xor ebx, ebx xor ecx, ecx xor edx, edx push 3A465443h push 20656874h push 20747261h push 74732073h push 2774654Ch mov ecx, esp ; addr mov dl, 14h ; len mov bl, 1 ; fd mov al, 4 int 80h ; LINUX ..
HackingCamp pwnable_simple_bof Write up 간단한 버퍼오버플로우 문제이다. 먼저 함수 하나하나 먼저 보겠다. char *my_strcpy() { char dest; // [rsp+0h] [rbp-90h] int v2; // [rsp+8Ch] [rbp-4h] puts("strcpy is so vulnerable"); v2 = read(0, g_buf, 0x100uLL); if ( v2 > 128 ) { puts("Segmentation fault (core dumped)"); exit(0); } return strcpy(&dest, g_buf); } 스틍라키 함수이다 v2가 128이 넘으면 튕기게되있으므로 이건 패스하겠다. char *my_strncpy() { char dest; // [rsp+0h] [rbp-90h] int v2; // [rsp+..
Codegate Misc_babymisc Write up 일단 리버싱 리버싱문제이다.... 요즘 리버싱을 공부하는데 나름 재밌게 풀수있는 문제인거같다. ### stage_1 _BOOL8 sub_400EA8() { size_t v0; // rbx char *compare_1; // [rsp+8h] [rbp-98h] char *compare_2; // [rsp+10h] [rbp-90h] char *s; // [rsp+18h] [rbp-88h] char input_1; // [rsp+20h] [rbp-80h] unsigned __int64 v6; // [rsp+88h] [rbp-18h] v6 = __readfsqword(0x28u); s = "TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oig="; setbuf(stdout, 0LL); puts(..
tamuCTF pwnable_pwn5 Write up 32비트 바이너리가 주어진다. 일단 이 문제에 대해서 말하면 mprotect함수를 써야한다. mprotect 함수를 이용하면 주어진 영역에 권한을 바꿀수 있다. 즉 쉘코드를 넣을수있는 최적의 함수이다. 좀더 응용하면 nx가 되어있는 상태에서도 쉘코드 실행이 가능하다 int mprotect (void *addr, size_t len, int prot); mprotect 함수에 원형이다. 이런식으로 함수를 호출하면된다. 일단 이문제에 취약한 함수를 찾아야한다. 일단 이름을 bss에 입력받는다. 여기에 쉘코드를 넣으면 될거같다. first_name 에 쉘코드를 넣고 mprotect로 돌리면 될거같다. 그러면 버퍼오버플로우가 되야할거같은데 좀만 더 찾아보면, 버퍼오버플로우가 발생하는 함수를 발견할수 있다. in..
RootCTF pwnable_Factorization(sandbag) Write up 보호되어 있는 글입니다.
ReverseKR Reverse_easy_ELF Write up 간단한 리눅스 바이너리 문제이다. 일단 IDA 로 까서 우리가 원하는 함수에 들어가야된다. int __cdecl main() { write(1, "Reversing.Kr Easy ELF\n\n", 0x17u); sub_8048434(); if ( sub_8048451() == 1 ) sub_80484F7(); else write(1, "Wrong\n", 6u); return 0; } 일단 메인함수이다 딱봐도 sub_80484F7(); 이 함수가 수상해보인다. ssize_t sub_80484F7() { return write(1, "Correct!\n", 9u); } 맞았다는 뜻이다. 즉 sub_8048451() 여기가 연산을 하는 함수가 된다. _BOOL4 sub_8048451() { if ( byte_..
Hitcon pwnable_start Write up 간단한 syscall SROP 문제이다. 일단 입력을 받으면 입력 받은걸 다시 되돌려준다. 이 방식을 이용하여 입력받는 변수 밑에있는 canary 값을 leak 할수있다. 각 가젯을 불러와서 우리가 실행시키고싶은 함수에 레지스터를 맟추고 그 함수를 호출시키면 풀리는 문제이다. 밑에 exit 를 넣은것은 프로그램을 정상적으로 종료하고싶어서 넣었다. from pwn import * p = process("./start") binf = ELF("./start") context.terminal = ['tmux', 'splitw', '-h'] #gdb.attach(p) prdi = 0x004005d5 prsi = 0x0047d69c pppr = 0x0047a6e6 addr_bss = binf.bss() addr_..
UbuntuCtf pwnable_thumb Write up 보호되어 있는 글입니다.