목록Wargame/pwnable.xyz (49)
Pwnstar
이런 게임류의 문제를 보면 뇌정지가 씨게 온다. 우선 취약점은 int __fastcall pve(__int64 a1, __int64 a2) { hero_struct *v2; // rbx signed __int64 v4; // [rsp+8h] [rbp-18h] if ( hero->level quest = (__int64)&quests + 196 * (rand() % 4); } else { print_quests(); printf("Pick a quest: ", a2); v4 = read_int(); if ( v4 quest = (__int64)&quests + 196 * v4; } return play_quest(hero->quest); } pve함수에서 나온다. level이 5보다 클 경우 퀘스트를 선택..
이틀동안 삽질하다가 결국 라업을 봤는데...house of force 문제란다....에휴 이 기법 쓰는 문제를 거의 안풀어봐서 감도 못잡았다ㅠㅠ got overwrite 가능 main int __cdecl main(int argc, const char **argv, const char **envp) { signed int v3; // eax setup(*(_QWORD *)&argc, argv, envp); while ( 1 ) { while ( 1 ) { print_menu(); v3 = readint(); if ( v3 != 1 ) break; make_note(); } if ( v3 9 ) { LODWORD(v0) = puts("Notebook full"); return (signed int)v0; ..
이제 브루트포싱 문제는 당분간 풀기 싫을 것 같다.ㅋㅋㅋㅋㅋ 다른 보호기법은 다 걸려있는데, 카나리만 안걸려 있어서 혹시 bof일까 했는데...결과적으로 bof가 터지는 것은 맞았으나 주소를 leak하는 과정이 괴랄하다. main int __cdecl main(int argc, const char **argv, const char **envp) { char *v3; // rsi char *v4; // rdi char s; // [rsp+0h] [rbp-90h] int v7; // [rsp+8Ch] [rbp-4h] setup(*(_QWORD *)&argc, argv, envp); puts("Around the world."); v3 = 0LL; v4 = &s; memset(&s, 0, 0x80uLL); d..
음 간단한 got overwrite문제이다. PIE도 안걸려 있음 int __cdecl main(int argc, const char **argv, const char **envp) { const char *v3; // rdi signed int v4; // eax int v6; // [rsp+4h] [rbp-Ch] int v7; // [rsp+8h] [rbp-8h] setup(); v3 = "Door To Other RealmS"; puts("Door To Other RealmS"); v6 = 0; v7 = 0; door = rand(); while ( 1 ) { while ( 1 ) { while ( 1 ) { while ( 1 ) { print_menu(v3); v4 = read_int32(v3, ..
코드의 쓸데없는 부분은 제외하고 필수적인 부분만 분석을 진행하여 설명해보려고 한다. got overwrite가 가능하다는 것만 기억하면 된다. int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax setup(); puts("Playing God today."); while ( 1 ) { print_menu(); switch ( (unsigned int)read_int32() ) { case 0u: return 0; case 1u: create_adult(); break; case 2u: create_child(); break; case 3u: age_up(); break; case 4u: age_down(..
이전 문제와 같은 취약점을 가지고 있는 문제이다. 카나리와 NX bit만 걸려 있음. int __cdecl main(int argc, const char **argv, const char **envp) { __int64 savedregs; // [rsp+10h] [rbp+0h] setup(*(_QWORD *)&argc, argv, envp); puts("Fill in the missing..."); while ( 1 ) { print_menu("Fill in the missing..."); read_int32(); switch ( (unsigned int)&savedregs ) { case 1u: fill_letters(); break; case 2u: fill_numbers(); break; case ..
음 이문제는 18.04에서 풀면 heap영역의 offset이 다르므로 이전 버전의 리눅스를 이용하는 걸 추천한다. 이것때문에 삽질 엄청 했음ㅠ 이번에도 역시 카나리와 nx bit만 걸려있다. main int __cdecl main(int argc, const char **argv, const char **envp) { __int64 savedregs; // [rsp+10h] [rbp+0h] setup(*(_QWORD *)&argc, argv, envp); printf("Name your notebook: "); readline((__int64)&nbook, 128, '\n'); while ( 1 ) { print_menu(); read_int(); switch ( (unsigned int)&savedre..
좀 복잡하게 만들어 놓은 uaf문제이다. uaf문제라는 건 감을 잡았었는데 그 이후로 왜 이렇게 오래 걸렸는 지 모르겠다. 보호기법은 카나리와 nx bit가 걸려있음. 메인함수는 별거 없어서 do_chat함수부터 보자. void __noreturn do_chat() { _QWORD *v0; // [rsp+0h] [rbp-120h] char *ptr; // [rsp+8h] [rbp-118h] char s; // [rsp+10h] [rbp-110h] unsigned __int64 v3; // [rsp+118h] [rbp-8h] v3 = __readfsqword(0x28u); v0 = 0LL; while ( 1 ) { memset(&s, 0, 255uLL); printf("@you> ", 0LL, v0); r..