查看保护机制:
这个开了nx保护,堆栈不可以执行
拉到ida看一下:
这道题没有binsh和system两个后门,所以这个需要libc地址,在main函数看到了libc_start_main函数,这里需要得到libc_base地址,通过真实地址-偏移地址
这里得到是真实地址, 0x7ffff7a2d830-240=‘0x7ffff7a2d740’
通过真实地址后面三位不变可以去得到偏移地址740
这就可以得到偏移地址
这道题主要的思路是:
通过栈上的格式化漏洞配合栈溢出漏洞,首先先利用格式化漏洞泄露libc地址,然后通过栈溢出执行system("/binsh")
上面可以得到sytem的offset为offset_system = 0x0000000000045390
offset_str_bin_sh = 0x18cd57
pop_rdi_ret = 0x0000000000400933
如何用格式化漏洞泄露libc地址:libc_start_main_addr=p.recvuntil("%11$p")[:-6] #64位elf前6个参数为寄存器传参
libc_base=int(libc_start_main_addr,16)-0x20830
这里涉及到一个叫做strsrtr()函数:
strstr(str,str):
列如:
char str2 = “cdef”
char str1 = ”abcdefgh“
则通过函数,将返回
strstr(str1,str2)= cdefgh
当如果str1不包括str2
char str2 = ”cxef“
char str1 = ”abcdefgh“
则通过函数,将返回
strstr(str1,str2) = null
想要栈溢出就需要跳过循环
gdb 先断在 b *0x000000000400885
变量s存在溢出,且要避免执行exit();查看if中比较的两个字符串,一个是“真香”,一个是“鸽子”,也就是说输入字符串s中要同时存在这两个词
循环中有两个字符串为”鸽子“和”真香”
这里还涉及到ljust()
脚本: