분류 전체보기

    callme

    1. intro 2. code 및 분석 2.1. code usefulFunction 0x00000000004008f2 : push %rbp 0x00000000004008f3 : mov %rsp,%rbp 0x00000000004008f6 : mov $0x6,%edx 0x00000000004008fb : mov $0x5,%esi 0x0000000000400900 : mov $0x4,%edi 0x0000000000400905 : call 0x4006f0 0x000000000040090a : mov $0x6,%edx 0x000000000040090f : mov $0x5,%esi 0x0000000000400914 : mov $0x4,%edi 0x0000000000400919 : call 0x400740 0x000..

    split

    1. intro 2. code 및 분석 2.1. code pwnme 0x00000000004006e8 : push %rbp 0x00000000004006e9 : mov %rsp,%rbp 0x00000000004006ec : sub $0x20,%rsp 0x00000000004006f0 : lea -0x20(%rbp),%rax 0x00000000004006f4 : mov $0x20,%edx 0x00000000004006f9 : mov $0x0,%esi 0x00000000004006fe : mov %rax,%rdi 0x0000000000400701 : call 0x400580 0x0000000000400706 : mov $0x400810,%edi 0x000000000040070b : call 0x400550 ..

    ret2win

    1. intro 2. code 및 분석 2.1. code main 0x0000000000400697 : push %rbp 0x0000000000400698 : mov %rsp,%rbp 0x000000000040069b : mov 0x2009b6(%rip),%rax # 0x601058 0x00000000004006a2 : mov $0x0,%ecx 0x00000000004006a7 : mov $0x2,%edx 0x00000000004006ac : mov $0x0,%esi 0x00000000004006b1 : mov %rax,%rdi 0x00000000004006b4 : call 0x4005a0 0x00000000004006b9 : mov $0x400808,%edi 0x00000000004006be : cal..

    format string bug - 스택의 값을 출력 값으로 쓸 수 없을까?

    서론 최근에 format string bug 문제를 풀던 와중에, 스택의 값 자체를 쓸 수 있는 방법이 없을까 고민하다 정말 그 방법이 있다는 것을 알게되어 정리한다. 본론 간단히 예를 들어보자. 아래와 같이 코딩 후 컴파일하였다. #include #include #include int main(){ char buf[100]; read(0,buf,100); printf(buf); } 더불어 format string bug가 발생한 직후에 break point를 걸고 스택의 값들을 보면 아래와 같다. [ Legend: Modified register | Code | Heap | Stack | String ] ───────────────────────────────────────────────────────..

    H4C - pwnable writeup (ALL)

    보호되어 있는 글입니다.

    System Hacking - mini phone

    1. intro 2. code 및 분석 2.1. code stripped 되어있기에 코드는 패스하자... 2.2. 분석 heap을 통해 이름, 나이, 주소 등을 받는다. 3. 취약점 확인 및 공격 준비 3.1. 취약점 heap overflow 3.2. 공격 준비 전역변수로 heap 주소를 관리한다. 쉬운 문제라면 heap 주소를 관리하는 부분을 선택할때 음수값을 넣어 double free가 가능한 경우가 많은데, 이 문제는 착실하게 다 막아놨다. 다만, 목록을 생성해보면 값들을 받은 뒤 가장 마지막에 다음 heap의 주소를 저장하는 것을 알 수 있으며 이 주소의 가장 마지막 값을 1바이트 조작 가능하다. 그러므로 이를 통해 다음 heap 주소의 위치를 조작할 수 있으며, 이것을 이용해 aar, aaw가 ..

    System Hacking - Unprintable

    1. intro 2. code 및 분석 2.1. code int __cdecl main(int argc, const char **argv, const char **envp) { char s[256]; // [rsp+0h] [rbp-100h] BYREF init(argc, argv, envp); memset(s, 0, sizeof(s)); fflush(stdout); read(0, s, 0x110uLL); sleep(5u); return 0; } 2.2. 분석 read 함수를 통해 0x110의 값을 받고 sleep 이후 종료된다. 3. 취약점 확인 및 공격 준비 3.1. 취약점 buffer overflow 3.2. 공격 준비 overflow가 발생하는 것은 자명하나, 출력 함수가 없어서 leak이 불가능하..

    System Hacking - syscall

    1. intro 2. code 및 분석 2.1. code Pseudocode signed __int64 start() { __int64 v1; // [rsp-8h] [rbp-8h] BYREF return sys_read(0, (char *)&v1 - 16, 0x130uLL); } assembler code public _start _start proc near push offset _exit mov eax, 0 mov edi, 0 ; fd mov rsi, rsp sub rsi, 10h ; buf mov edx, 130h ; count syscall ; LINUX - sys_read retn 2.2. 분석 syscall로 read를 실행하며, overflow가 발생한다. 3. 취약점 확인 및 공격 준비 3..

    System Hacking - Simple_VM

    1. intro 2. code 및 분석 2.1. code __int64 sub_40125B() { __int64 result; // rax __int64 s[257]; // [rsp+0h] [rbp-810h] BYREF unsigned __int8 v2; // [rsp+80Bh] [rbp-5h] int v3; // [rsp+80Ch] [rbp-4h] memset(s, 0, 0x100uLL); v3 = 0; qword_4040A0 = 0LL; while ( 1 ) { result = byte_404100[v3]; if ( !(_BYTE)result ) break; v2 = byte_404100[v3]; switch ( v2 & 0xF0 ) { case 32: s[qword_4040A0++] = qword_..

    System Hacking - Notepad

    1. intro 2. code 및 분석 2.1. code int __cdecl main(int argc, const char **argv, const char **envp) { int v4; // [rsp+4h] [rbp-Ch] BYREF size_t size; // [rsp+8h] [rbp-8h] BYREF init(argc, argv, envp); v4 = 0; size = 0LL; while ( 1 ) { menu(); _isoc99_scanf("%d", &v4); switch ( v4 ) { case 1: writememo(); break; case 2: editmemo(); break; case 3: readmemo(); break; case 4: removememo(); break; case ..