首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决mprotect() syscall故障

解决mprotect() syscall故障
EN

Stack Overflow用户
提问于 2015-06-26 08:16:06
回答 1查看 2.1K关注 0票数 0

在调用int0x80eax之后,我正在编写一些ROP利用代码通过syscall调用mprotect的代码,该代码设置为0x0表示成功。将执行转移到目标地址仍然会导致SIGSEGV。我希望有人能告诉我我哪里出了问题。

一些细节,目标地址是.data部分,这是我按外壳代码编写到:[20] 0x8146820->0x814c2b8 at 0x000fd820: .data ALLOC LOAD DATA HAS_CONTENTS的部分

我将eax设置为125ebx设置为页面边界0x8146000ecx设置为0x1000 (4096页大小),edx设置为0x7 (RWX)。

就在syscall之前,寄存器如下所示:

代码语言:javascript
复制
eax            0x7d 125
ecx            0x1000   4096
edx            0x7  7
ebx            0x8146000    135553024
esp            0xbffff2b0   0xbffff2b0
ebp            0x8d0e0f0    0x8d0e0f0
esi            0x804fb85    134544261
edi            0x43434343   1128481603
eip            0x80c0182    0x80c0182 <mprotect+18>
eflags         0x202    [ IF ]
cs             0x73 115
ss             0x7b 123
ds             0x7b 123
es             0x7b 123
fs             0x0  0
gs             0x33 51
(gdb) disas $eip, $eip+20
Dump of assembler code from 0x80c0182 to 0x80c0196:
=> 0x080c0182 <mprotect+18>:    int    $0x80
   0x080c0184 <mprotect+20>:    pop    %ebx
   0x080c0185 <mprotect+21>:    cmp    $0xfffff001,%eax
   0x080c018a <mprotect+26>:    jae    0x80c7d80 <__syscall_error>
   0x080c0190 <mprotect+32>:    ret    

在syscall之后,登记册是:

代码语言:javascript
复制
(gdb) si
0x080c0184 in mprotect ()
(gdb) i r
eax            0x0  0
ecx            0x1000   4096
edx            0x7  7
ebx            0x8146000    135553024
esp            0xbffff2b0   0xbffff2b0
ebp            0x8d0e0f0    0x8d0e0f0
esi            0x804fb85    134544261
edi            0x43434343   1128481603
eip            0x80c0184    0x80c0184 <mprotect+20>
eflags         0x202    [ IF ]
cs             0x73 115
ss             0x7b 123
ds             0x7b 123
es             0x7b 123
fs             0x0  0
gs             0x33 51

但是,内存位置没有显示权限的更改,并试图在那里执行指令,从而终止应用程序:

代码语言:javascript
复制
(gdb) x/4x 0x8146820
0x8146820:      0x00000000      0x00000000      0x08146154      0x0000ea60
(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x08146820 in data_start ()

任何关于如何调试或我做错了什么的建议都是受欢迎的。

编辑--我在没有附加调试器的情况下运行它,看起来mprotect调用是成功的,但是执行失败:

代码语言:javascript
复制
stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2197, ...}) = 0
mprotect(0x8146000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0} ---
+++ killed by SIGSEGV (core dumped) +++

从核心确认坠机地址:

代码语言:javascript
复制
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x08146820 in data_start ()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-29 07:40:27

你的电话成功了。程序崩溃是因为0x8146820保存0x0000 (反汇编为add [eax], al ),eax保存零。但是地址0没有映射。(这就是为什么分段故障发生在si_addr=0)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31068263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档