system 的shellcode问题

delevery 2012-06-29 11:24:12
模拟一个在f函数的溢出

实现 system(“net user abc /add”)功能

void f(char*ch){

char a[200];
strcpy(a,ch);



}



mov eax,0x12fea80;//a[200]地址在0x0012fea8,由于有00字符,就采取右移4位方式
xor cl,cl;
inc cl;
inc cl;
inc cl;
inc cl;
shr eax,cl;//cl=4;右移4位
push eax;
mov eax,0x78b02632//system函数地址
call eax;//调用system



机器码注入后,为什么system调用失败,指针地址正确,函数地址正确!!!!

...全文
162 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-06-29
  • 打赏
  • 举报
回复
如果想查看在release下对应汇编,在感兴趣的地方插入__asm int 3
赵4老师 2012-06-29
  • 打赏
  • 举报
回复
编译选项关闭堆栈检查,C++异常,
赵4老师 2012-06-29
  • 打赏
  • 举报
回复
先用纯C实现。
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
然后改用嵌入汇编实现。
如果嵌入汇编实现错误,对比之前纯C实现对应的汇编。
delevery 2012-06-29
  • 打赏
  • 举报
回复
之前因为地址是0x0012fea8 我先把地址取非为0xffed0157
int not(int i){//求非,1变0变1


_asm{
mov eax,i;
not eax;
}
}
然后在代码
mov eax,0xffed0157;
not eax;
push eax;
调试发现奇怪现象,执行not这句代码,程序会跳到别处,然后在回来eax,值也正确。现在换成shr,执行shr后也会跳到别处执行,然后eax值也正确。

在system函数中 有句 mov [eax],xxx;
其中eax为1,产生异常。

本人菜鸟,第一次发帖。请各位帮我解决下
delevery 2012-06-29
  • 打赏
  • 举报
回复
够的,堆栈保护也关了,debug后,看到程序已经跳入上面的汇编代码那儿了。
赵4老师 2012-06-29
  • 打赏
  • 举报
回复
权限不够?
delevery 2012-06-29
  • 打赏
  • 举报
回复
崩溃中

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧