最簡單的一道題,考點是UAF。說是UAF但是其實根本就不算是真正的UAF利用,無非就是對釋放的記憶體塊進行同大小的佔位。因為程式中會把記憶體塊的內容作為system函式的引數,所以只要重新佔位並寫入/bin/sh就可以了,這道題還是相當簡單的。
int __cdecl main(int argc, const char **argv, const char **envp)
{
setbuf(_bss_start, 0LL);
puts("THOU ART GOD, WHITHER CASTEST THY COSMIC RAY?");
if ( fgets(&buf, 50, stdin) )
{
v4 = strtol(&buf, 0LL, 0);
v5 = v4;
v6 = v4 >> 3;
bianhuan = (v4 >> 3) & 0xFFFFFFFFFFFFF000LL;
if ( mprotect((void *)bianhuan, 4096uLL, 7) )
{
perror("mprotect1");
}
else
{
v3 = 1;
*(_BYTE *)v6 ^= 1 << (v5 & 7);
if ( mprotect((void *)bianhuan, 0x1000uLL, 5) )
{
perror("mprotect2");
}
else
{
puts("WAS IT WORTH IT???");
v3 = 0;
}
}
}
}