linux 64位栈溢出分析

本文详细介绍了在64位Ubuntu环境下,如何分析栈溢出并利用Return-Oriented Programming(ROP)控制程序流程。通过设置DEP和ASLR,调试一个简单的C程序,展示了如何找到关键代码,控制栈中的寄存器,最终实现调用`write`和`system`函数,执行`/bin/sh`,从而演示了栈溢出攻击的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调试环境是ubuntu16 64位
这次开启了DEP、ASLR(知道libc.so情况下)
还是参考了《一步一步学ROP之linux_x64篇》这篇文章。

代码是1.c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void vulnerable_function() {
    char buf[128];
    read(STDIN_FILENO, buf, 256);
}

int main(int argc, char** argv) {
    vulnerable_function();
    write(STDOUT_FILENO, "Hello, World\n", 13);
}
gcc -fno-stack-protector -o 1 1.c
开启ASLR:
sudo -s 
echo 2 > /proc/sys/kernel/randomize_va_space
exit
首先获取几个变量:
main函数地址:
yang@yang-virtual-machine:~/test$ objdump -d 1 | grep main
  400410:	e8 4b 00 00 00       	callq  400460 <__libc_start_main@plt+0x10>
0000000000400450 <__libc_start_main@plt>:
  400494:	e8 b7 ff ff ff       	callq  400450 <__libc_start_main@plt>
0000000000400587 <main>:
yang@yang-virtual-machine:~/test$ 
可以看到main函数地址是0x400587。

.bss段的首地址:
yang@yang-virtual-machine:~/test$ readelf -S 1 | grep bss
  [26] .bss              NOBITS           0000000000601040  00001040
yang@yang-virtual-machine:~/test$ 
可以看到.bss段的首地址是0x601040
介绍一下linux64位的函数传参方式,是通过rdi rsi rdx rcx r8 r9依次入栈的 (Windows64位是rcx rdx r8 r9依次入栈的)。所以如果需要调用函数,就需要控制rdi rsi等寄存器,而不仅仅是控制栈了。
这就需要寻找相关代码了,在libc.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值