当前位置: 首页 > 知识库问答 >
问题:

评估寄信人地址的偏移量 [重复]

万楷
2023-03-14

我试图通过使用gdb-peda中创建的循环模式,在简单的缓冲区溢出期间检索Ret地址的偏移量。我期望返回到被调用方的帧上有一个sigsegv,但是我在注入缓冲区的printf期间得到了它。

我正在使用x86 kali linux。我可以算出我的重地址是264字节,我可以通过rop-ing来利用这个程序。我想在整个循环模式中评估RET地址,因此我在gdb-peda中使用了它

gdb-peda$ pattern_create 300 tmp.txt 

创建模式。最后,我将我的二进制文件启动为:

gdb-peda$ r `cat tmp.txt`

ASLR被禁用,二进制文件编译为:

gcc -mpreferred-stack-boundary=2 rop.c -o rp    

这是rop. c程序:

int main(int argc, char *argv[])
{
    char buf[256];

    strcpy(buf, argv[1]);
    printf(buf);
}

我希望在main的返回处有一个sigegv,ESP指向循环模式的一段,释放RET地址的偏移量,而不是在printf期间得到一个SIGSEGV。我正在报告peda输出:

gdb-peda$ r `cat tmp.txt`
Starting program: /mnt/hgfs/SSI/ROP/rp `cat tmp.txt`

Program received signal SIGSEGV, Segmentation fault.

[----------------------------------registers-----------------------------------]

EAX: 0x41414241 ('ABAA')
EBX: 0xb7fbe000 --> 0x1d4d6c
ECX: 0x0 
EDX: 0x1 
ESI: 0xb7fbed80 --> 0xfbad2a84 
EDI: 0xe0 
EBP: 0xbffff118 --> 0xbffff248 ("%2A%HA%dA%3A%IA%eA%4A%JA%fA%5A%KA%gA%6A%LA")
ESP: 0xbfffec0c --> 0xb7e338d2 (<_IO_vfprintf_internal+8322>:   add    esp,0x10)
EIP: 0xb7e8163f (<__strlen_ia32+15>:    cmp    BYTE PTR [eax],dh)
EFLAGS: 0x10202 (carry parity adjust zero sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0xb7e81639 <__strlen_ia32+9>:    and    edx,eax
   0xb7e8163b <__strlen_ia32+11>:   je     0xb7e81661 <__strlen_ia32+49>
   0xb7e8163d <__strlen_ia32+13>:   jp     0xb7e81656 <__strlen_ia32+38>
=> 0xb7e8163f <__strlen_ia32+15>:   cmp    BYTE PTR [eax],dh
   0xb7e81641 <__strlen_ia32+17>:   je     0xb7e816e6 <__strlen_ia32+182>
   0xb7e81647 <__strlen_ia32+23>:   inc    eax
   0xb7e81648 <__strlen_ia32+24>:   cmp    BYTE PTR [eax],dh
   0xb7e8164a <__strlen_ia32+26>:   je     0xb7e816e6 <__strlen_ia32+182>
[------------------------------------stack-------------------------------------]
0000| 0xbfffec0c --> 0xb7e338d2 (<_IO_vfprintf_internal+8322>:  add    esp,0x10)
0004| 0xbfffec10 ("ABAA\022\362\377\277\001")
0008| 0xbfffec14 --> 0xbffff212 ("%sA%BA%$A%nA%CA%-A%(A%DA%;A%)A%EA%aA%0A%FA%bA%1A%GA%cA%2A%HA%dA%3A%IA%eA%4A%JA%fA%5A%KA%gA%6A%LA")
0012| 0xbfffec18 --> 0x1 
0016| 0xbfffec1c --> 0x34 ('4')
0020| 0xbfffec20 --> 0x1d5c0c 
0024| 0xbfffec24 --> 0x0 
0028| 0xbfffec28 --> 0x200034 ('4')
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
__strlen_ia32 () at ../sysdeps/i386/i586/strlen.S:51
51  ../sysdeps/i386/i586/strlen.S: File o directory non esistente.

我能够利用该程序,但我无法理解此错误的原因。谢谢

共有1个答案

束涵涤
2023-03-14

您的漏洞利用字符串(外壳代码)是否包含任何%字符?您将它作为格式字符串传递给printf。

由于您的main只向printf传递了一个参数,所以堆栈上有任何垃圾,这不是指向以0结尾的字符串的有效指针,因此printfsegfaults。

即您的目标程序也存在格式字符串漏洞,并且您正在利用它在main返回之前进行拒绝服务攻击。: P

使用printf(“%s”,buf)fprintf(buf,stdout)打印任意字符串。

或者如果您不介意附加换行符,请使用put(buf)

 类似资料:
  • 问题内容: 我知道,如果我在某个从函数某处调用的函数内,那么此返回地址将压入堆栈。 在上面的代码中,当foo函数处于活动状态时,我将获取堆栈中第一个推送的局部变量的地址。我如何访问在此变量堆栈之前的某个地方返回的返回地址(主要称为foo)?该位置是否固定并且可以相对于第一个局部变量访问?我该如何修改? 编辑:我的环境是带有gcc编译器的x86处理器上的Ubuntu 9.04。 问题答案: 有一个内

  • 问题内容: 我最近读到了Python 3的一个好处是它很懒。那就更好了 而不是 我很好奇的是如何使用这种懒惰。如果生成映射对象,例如,如何访问生成的操作/列表中的特定元素。在我所见过的几乎所有文档中,他们都会做类似或的事情(据我所知),它放弃了惰性概念,因为它隐式将地图转换为列表。 我想我正在寻找的是能够以与我可以懒惰地懒惰地生成地图对象类似的方式使用地图对象的能力,并且可以在没有巨大计算量的情况

  • 为什么该方法使用UTC时区()而不包括本地时间偏移量()?方法名称中的“ISO”指的是ISO 8601-它允许将“时区指定”表示为其格式的一部分。 换句话说,告诉我日期和时间,以及时区偏移量(通过)。但是只告诉我一个时区中的日期和时间-它丢弃了在区域设置中产生的时间信息。 也包括始发时区与UTC的偏移量不是很有意义吗?省略+/-hh:ss会丢失关于原始的信息(如果它用于序列化的话)。 我的所有AJ

  • 我已经根据文档集成了华为崩溃服务,并且能够在Web控制台中看到NDK崩溃。但是,报告中的地址偏移了4,因此当我想符号崩溃时,我得到了错误的结果。 例如,在logcat中,我可以看到 并且这些地址出现在web控制台中,而有效的logcat崩溃堆栈跟踪是 有什么想法吗?

  • 问题内容: 是否可以跳过X个第一行,并在一个查询中选择所有其他行?像那样: 它将选择:pqr,stu,vwx,yz 我尝试使用LIMIT和OFFSET完成此操作,但是问题是表是动态的,而且我不知道应该输入哪个LIMIT(我不知道表中有多少行)。 问题答案: 如果只需要最后N行,请尝试以下操作: 这会根据的顺序为您提供最后几条记录。 您可以使用自动递增的主键(希望有一个主键)来确定行的顺序(如果无法

  • 我正在尝试将Twitter日期时间转换为本地ISO字符串(用于prettyDate),现在为2天。我只是没弄准当地时间.. im使用以下功能: 在newdate中,一切正常,但toISOString()将它再次返回到原始时间。有谁能帮我从Twitterdate格式为:Thu,31 May 2012 08:33:41+0000的iso中获取当地时间吗