본문 바로가기

CTF/Pwnable.xyz

(8)
Pwnable.xyz pwnable_two_target Write up got_overwrite 문제이다. 나름 재밌었던 문제였던거 같기도하고, 일단 IDA로 까보자~ int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { int index_input; // eax char name; // [rsp+10h] [rbp-40h] __int64 nationality; // [rsp+30h] [rbp-20h] __int64 age; // [rsp+40h] [rbp-10h] unsigned __int64 v7; // [rsp+48h] [rbp-8h] v7 = __readfsqword(0x28u); setup(argc, argv, envp); memset(&name, 0, 0x38uLL); // nam..
Pwnable.xyz pwnable_GrownUpRedist Write up 포맷 스트링 버그 문제이다. 또 strcpy 관련된거 도 들어있는 합성된 문제이다. 나름 풀만했다. 일단 flag가 바이너리 안에 존재했다. 아마 포맷스트링으로 저거 불러오라는거같다. int __cdecl main(int argc, const char **argv, const char **envp) { char *src; // [rsp+8h] [rbp-28h] __int64 buf; // [rsp+10h] [rbp-20h] __int64 v6; // [rsp+18h] [rbp-18h] unsigned __int64 v7; // [rsp+28h] [rbp-8h] v7 = __readfsqword(0x28u); setup(argc, argv, envp); buf = 0LL; v6 = 0LL; printf("..
Pwnable.xyz pwnable_xor Write up 보호되어 있는 글입니다.
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.xyz pwnable_note Write up 이 문제는 여러방면으로 풀수 있는거같았다. 처음에 일반적인 익스로 하였는데 아는 선배가 쉘도 딸수 있다고해서 익스를 해보니 진짜 되었다. 2019-12-07일 추가----------------------------- edit_desc 를 보면 s+32안에 heap 주소를 넣어주고있다. 근데 어셈블리를 뒤로가보면, s+32에서 그대로 꺼내서 read로 쓰고있는것을 확인할수있다. 즉 여기서 got_overwrite가 발생하게된다. 일단 edit_note에서 우리가원하는만큼 값을 입력받고 s에 그대로 복사할수있다. 즉 s+32안에 free_got를 넣고 desc를 할떄 우리가 원하는 함수인 win함수를 넣어주게되면 완벽하게 풀릴것이다. from pwn import * p = process("./challeng..