[问题] 这个ret2text的exploit问题

楼主: b0920075 (Void)   2016-11-03 14:00:52
开发平台(Platform): (Ex: Win10, Linux, ...)
linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc -zexecstack -fno-stack-protector
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
其实不知道能不能发到这里,但是资安版太少人,这又跟C有一点点关系就发到这里了,不妥麻烦版主删掉QQ
我自己在看大神教学影片学习的时候看到一个exploit,对大神的注解有点疑问
这是影片中的有洞的程式source code:
http://imgur.com/a/uogvP
环境下只有开ASLR,其他DEP和stack protector没开
这是大神的exploit(python写的,我只撷取部分):
http://imgur.com/a/gZcKS
补上完整版的:
http://imgur.com/a/Uj6nZ
后面加上r.interactive()就是完整版的exploit了
我的理解是:里面的'A'*112是padding,p32(0x08048310)[email protected]/*
作者: Schottky (顺风相送)   2016-11-03 14:46:00
这个 exploit 根本不能用吧
楼主: b0920075 (Void)   2016-11-03 14:49:00
喔喔这个只是测试有没有跳过去啦,我没有截送shellcode的图,想说那边不是我要问的重点
作者: Schottky (顺风相送)   2016-11-03 14:58:00
你的理解没错,呼叫时先 push 参数再 push ret address所以我觉得是写 exploit 的人完全弄反了gets 填资料是由低位址向高位址填,就算 overflow也根本不会盖到 gets 的 return address你确定原始的 exploit 真的能用?
楼主: b0920075 (Void)   2016-11-03 15:02:00
我上面那个只是撷取exploit的一部分而已,原本的测试过可以用等下补放完整的
作者: Schottky (顺风相送)   2016-11-03 15:40:00
这 exploit 还是一样怎么看都不对通常 padding 也是用 0x90 (NOP) 而不会用 'A'不过重点还是 gets 的 return address 并不会被盖到会被盖到的是 main() 的 return address所以我有点好奇,你是怎么确定这 exploit 可以用的
楼主: b0920075 (Void)   2016-11-03 16:04:00
呃因为我测过可以用,然后他main ret address被盖成get@plt,所以后面gets的利用应该是自己做一个ret address让他跳而不是一般的覆蓋至于nop sled我个人习惯也是写\×90啦,可是那是因为之前做的需要跳回buf让他滑,如果没有要跳回buf应该填A也没关系
作者: Schottky (顺风相送)   2016-11-03 16:13:00
那听起来被盖到的是 main 而不是 gets 的 return addres但还是很不对劲,buf 里都填满 A 了,shell code 是写到哪里去?你既然知道 nop sled 那应该知道一般就是把 shell code填在 stack 的 char buf[100] 里面,免得出别的槌啊...
楼主: b0920075 (Void)   2016-11-03 16:17:00
因为有开aslr,所以应该是写到全域变量(即使开aslr也不会变)那个section里面吧因为global不会变,所以尽量写在global里面,讲师是这样讲的
作者: Schottky (顺风相送)   2016-11-03 16:19:00
Intel 组合语言里叫他 data segment ... 我懂你的意思了不过我还是觉得位置关系对不上可能这边的 calling convension 和我以前学的不太一样了
楼主: b0920075 (Void)   2016-11-03 16:21:00
啊记错惹><我老是把section segment搞错
作者: Schottky (顺风相送)   2016-11-03 16:25:00
那个 'A' 为什么是填 112 个,这一点我一直想不透
楼主: b0920075 (Void)   2016-11-03 16:28:00
这是buffer到ebp位置的byte数,测出来的
作者: Schottky (顺风相送)   2016-11-03 16:31:00
可能是 main() 的某些特殊参数吧? 虽然原始码没写出来啊,main 的参数应该放在 main 的 ret addr 前面才对
继续阅读

Links booklink

Contact Us: admin [ a t ] ucptt.com