본문 바로가기

CTF

(51)
Pwnable.xyz pwnable_misailgnment Write up 약간 전에 문제랑 비슷한 형태이다. 근데 이건 약간에 메모리에 대한 이해가 필요하다. int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [rsp+10h] [rbp-A0h] _QWORD v5[3]; // [rsp+18h] [rbp-98h] __int64 v6; // [rsp+30h] [rbp-80h] __int64 v7; // [rsp+38h] [rbp-78h] __int64 v8; // [rsp+40h] [rbp-70h] unsigned __int64 v9; // [rsp+A8h] [rbp-8h] v9 = __readfsqword(0x28u); setup(*&argc, argv, envp); memset(&s, 0,..
Pwnable.xyz pwnable_add Write up 약간 헷갈렸던 문제이다. int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax __int64 v4; // [rsp+8h] [rbp-78h] __int64 v5; // [rsp+10h] [rbp-70h] __int64 v6; // [rsp+18h] [rbp-68h] __int64 v7[11]; // [rsp+20h] [rbp-60h] unsigned __int64 v8; // [rsp+78h] [rbp-8h] v8 = __readfsqword(0x28u); setup(); while ( 1 ) { v4 = 0LL; v5 = 0LL; v6 = 0LL; memset(v7, 0, 80uLL); printf("In..
Pwnable.xyz pwnable_sub Write up 진짜 개쉽다. 예전에 한번 푼 적이있었는데, 지금와서 다시풀어보니 이건 진짜 너무쉽다 아마 welcome보다 쉬울꺼다. __int64 __fastcall main(__int64 a1, char **a2, char **a3) { int v4; // [rsp+0h] [rbp-18h] int v5; // [rsp+4h] [rbp-14h] unsigned __int64 v6; // [rsp+8h] [rbp-10h] v6 = __readfsqword(0x28u); sub_A3E(a1, a2, a3); v4 = 0; v5 = 0; _printf_chk(1LL, "1337 input: "); _isoc99_scanf("%u %u", &v4, &v5); if ( v4
Pwnable.xyz pwnable_welcome Write up 약간 어려웠던 문제이다. 먼저 main함수를 보겠다. __int64 __fastcall main(__int64 a1, char **a2, char **a3) { _QWORD *v3; // rbx __int64 v4; // rdx char *v5; // rbp __int64 v6; // rdx size_t v7; // rdx size_t size; // [rsp+0h] [rbp-28h] unsigned __int64 v10; // [rsp+8h] [rbp-20h] v10 = __readfsqword(0x28u); sub_B4E(); puts("Welcome."); v3 = malloc(0x40000uLL); *v3 = 1LL; _printf_chk(1LL, "Leak: %p\n", v3); _printf_..
Pwnable.kr pwnable_echo1 Write up 정말 쉬운 문제이다. 일단 이 문제를 풀려면 약간에 디버깅이 필요하다. 먼저 앞서 취약점을 찾아야되므로 IDA를 통해 정적으로 해보겠다. 1번 메뉴를 보면 128바이트를 입력받고있는것이 보인다. 하지만 s를 보게되면 막상 20바이트만 가지고있다. 즉 여기서 오버플로우가 발생하게된다. 우리는 여기서 생각할수있다. ROP를 하거나 NX가 걸려있지 않으면 쉘코드를 넣어서 익스할수 있겠다고, checksec을 통해서 NX가 걸려있는지 확인해보자. 딱히 걸려있지 않으므로 쉘코드를 써도된다. 근데 이제 이걸 어떻게 써야하냐이다. 음 그럼 디버깅을 해보자 일단 이름을 받을수있다. 이걸 한번 기억해보자. 그리고 우리는 RET를 조작이 가능하다. 흠,,, 그럼 어떻게 해야할까... 답은 RSP를 이용하면 된다. 일단 우..
Pwnable.kr pwnable_fsb Write up 오리지널한 FSB문제이다. 그런만큼 푸는방법도 약간 다양한거같다. 나는 GOT overwrite로 풀었다 일단 FSB니까 출력해주는부분에서 브레이크 포인트를 걸고 스택을 확인해보겠다. 요런식에 스택을 가지고있다. 처음에 시나리오는 KEy값을 메모리에서 가져와서 하는 방식을 생각해봤는데 안될거같아서 GOt overwrite로 한것이다. 일단 지금꺼를 보면 입력은 read로 받는다 즉 data영역에 저장이된다. 하지만 저렇게 상대 포인터를 가지고있고, 접근이 가능하기떄문에 got overwrite로 풀면 될것이다. %134520836c%14$n %134514347c%20$n 하나는 Printf got이다. printf를 사용하므로 printf got를 사용하였다. 그래서 printf_got를 이용해서 우리가..
Pwnable.tw pwnable_silver_bullet Write up 일단 이문제 디버깅 자체는 쉽다. 아마 전에 푼것보다 쉬운거같다. int __cdecl main(int argc, const char **argv, const char **envp) { int Input; // eax int v5; // [esp+0h] [ebp-3Ch] const char *v6; // [esp+4h] [ebp-38h] char s; // [esp+8h] [ebp-34h] int v8; // [esp+38h] [ebp-4h] init_proc(); v8 = 0; memset(&s, 0, 0x30u); v5 = 0x7FFFFFFF; v6 = "Gin"; while ( 1 ) { while ( 1 ) { while ( 1 ) { while ( 1 ) { menu(v5, v6); Input ..
Pwnable.kr pwnable_Simple_login Write up login 인 문제이다. 일단 바이너리 한개가 주어지는데, 역시 IDA로 까본다. 일단 디버깅은 쉽다 인코딩해서 이것저것... int __cdecl main(int argc, const char **argv, const char **envp) { int v4; // [esp+18h] [ebp-28h] char Input; // [esp+1Eh] [ebp-22h] unsigned int Input_length; // [esp+3Ch] [ebp-4h] memset(&Input, 0, 0x1Eu); // 초기화 setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 1, 0); printf("Authenticate : "); _isoc99_scanf("%30s", &Input); // ..