void__attribute__((noreturn))__stack_chk_fail(void){__fortify_fail("stack smashing detected");}void__attribute__((noreturn))internal_function__fortify_fail(constchar*msg){/* The loop is added only to keep gcc happy. */while(1)__libc_message(2,"*** %s ***: %s terminated\n",msg,__libc_argv[0]?:"<unknown>");}
思路
由于flag已经在stack上可考虑leak flag
gdb计算输入的内容到argv[0]距离
**leak puts address -> compute libc base **
compute environ address -> 通过 environ leak stack address
compute offset (stack addr and flag addr) -> leak flag
注:environ里存有stack地址
gdb计算输入的内容到argv[0]距离
在gets后下断点,也就是strcmp处
gdb下断点输入aaaa
**argv[0]地址: **0x7fffffffe4a8
输入的地址:0x7fffffffe380
offset = 0x128
构造payload
payload = 'a'*0x128 + leak address
获取environ真实地址-> 可leak stack 真实地址
可见enviro真实地址不在栈上
相同方法 environ addr -> leak stack addr -> compute offset (stack addr and flag addr) -> leak flag