목록Wargame/pwnable.xyz (49)
Pwnstar
드디어 마지막 문제다. 근데 마지막 문제치고는 좀 많이 쉬웠음. PIE랑 relro가 안걸려있다. main int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { __int64 *v3; // rbx int i; // ebp __int64 *v5; // r12 signed int v6; // eax __int64 v7; // [rsp+0h] [rbp-48h] unsigned __int64 v8; // [rsp+28h] [rbp-20h] v8 = __readfsqword(0x28u); setup(); puts("====== Welcome to notes v5 ======"); puts("Here is your favorite..
후 adultvm의 마지막 문제이다. adultvm2에서 조금 더 응용해서 진행하면 되는데, 좀 더 신경써야하는 부분이 있다면 def handle_kernel_interrupt(uc, intno, data): if intno == 0x70: rax = uc.reg_read(UC_X86_REG_RAX) if rax == 0: rdi = uc.reg_read(UC_X86_REG_RDI) rsi = uc.reg_read(UC_X86_REG_RSI) rdx = uc.reg_read(UC_X86_REG_RDX) uc.mem_protect(rdi, rsi, rdx) elif rax == 7: rdi = uc.reg_read(UC_X86_REG_RDI) rsi = uc.reg_read(UC_X86_REG_RSI) r..
후 이제 몇문제 안남았다 조금만 더 힘내보자. 제공되는 파일은 adultvm문제와 동일하다. mu.mem_write(KERNEL_ADDRESS + 0x5000, flag2) 다른 점은 이번엔 플래그가 커널 영역에 있다는 점인데, 뭐 당연하게도 이 영역에는 읽기 권한이 없을 듯. 그래서 mprotect syscall을 호출해서 읽기 권한을 줘야한다. 인자를 할당해주는 방법은 show_note를 활용하면 된다. 이렇게 mprotect syscall을 호출해서 권한을 할당해주는 것은 어렵지 않았다. 근데 이 다음부터 삽질을 오지게 했음. 하다 안되서 주변 친구에게 도움을 요청했는데, kernel파일을 잘 살펴봐야한다고 한다.... 그 전에, 제공되는 문제 파일중에 kernel이라는 파일이 있는데, 요걸 아이다..
파일이 뭐가 되게 많은데 필수적으로 봐야할 것들만 보자. 바이너리 하나, kernel을 실행시켜주는 파이썬 스크립트가 하나 플래그 파일 세 개, kernel이라는 파일이 하나(이건 아직 뭔지 잘 모르겠다.)가 있다. 우선 파이썬 스크립트부터 보자. #!/usr/bin/env python2 import sys import os from unicorn import * from unicorn.x86_const import * from threading import Thread from Queue import Queue from elftools.elf.elffile import ELFFile kernel_queue = Queue(1) user_queue = Queue(1) KERNEL_ADDRESS = 0xFF..
이번 문제도 며칠 잡고 있을 줄 알았는데 운이 좋아서 빨리 풀었다. 카나리와 nx만 걸려있음. 역시나 힙 문제이다. 1. 코드분석 main int __cdecl main(int argc, const char **argv, const char **envp) { int running; // [rsp+8h] [rbp-8h] __int64 savedregs; // [rsp+10h] [rbp+0h] running = 1; setup(); show_banner(); init_first_note(); LABEL_8: while ( running ) { show_menu(); printf("> "); get_int(); switch ( (unsigned int)&savedregs ) { case 1u: create_n..
라업을 보고 풀었음. 라업을 보고 풀게 되면 아무래도 내가 스스로 푼 문제보다 기억에도 덜 남고, 놓치고 가는 부분이 많아서 좀 더 꼼꼼하게 분석을 하고 넘어가려고 한다. 요 문제는 16.04에서 풀어보는 것을 추천함...relro가 partial이라 got overwrite가 가능하다.1.코드분석 mainint __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax setup(*(_QWORD *)&argc, argv, envp); banner(); while ( 1 ) { show_menu(); switch ( (unsigned int)read_int() ) { case 1u: add_group_member();..
라업을 보고 풀려고 했는데, 보고 풀땐 풀더라도 확실하게 이해를 하고 넘어가야할 문제같다. 코드분석부터 차근차근 해 보자. 함수를 검색해도 잘 나오지 않는다. mainint __cdecl main(int argc, const char **argv, const char **envp) { size_t program_size; // [rsp+28h] [rbp-1018h] char program[4096]; // [rsp+30h] [rbp-1010h] unsigned __int64 v6; // [rsp+1038h] [rbp-8h] v6 = __readfsqword(0x28u); memset(program, 0, sizeof(program)); setup(); puts("Run the default program..
이전 문제보다 더 어렵고 복잡한 문제였다....막히는 부분 중간중간 라업을 좀 참고하면서 풀었다. 모든 보호기법이 다 걸려있음. 함수 이름들을 내가 다 임의로 붙여줘서 참고하시길 바란다. __int64 __fastcall main(__int64 a1, char **a2, char **a3) { setup(); init_game(); print_explain(); play((const char *)a1); return 0LL; } 메인함수는 별거 없고 play부터 시작한다. play함수를 보기 전에 init_game함수를 보자 init_game __int64 init_game() { _DWORD *v0; // rax _QWORD *v1; // rax __int64 result; // rax qword_20..