我开始从https://azeria-labs.com/writing-arm-shellcode/学习有关ARM汇编的知识,我想练习从套接字接收数据。这是到目前为止我正在学习的代码片段。测试是在移动设备上完成的。
网络客户端代码
@socket syscall
movw r7,#281
mov r0,#2
mov r1,#1
sub r2,r2,r2
svc #1
mov r6,r0
@connect syscall
movw r7,#283
adr r1,struct
strb r2,[r1,#1]
mov r2,#16
mov r0,r6
svc #1
@recv syscall
mov r0,r6
mov r3, #100
adr r1,to_receive
mov r2,#receive_size
movw r7,#291
svc #1
@write syscall
mov r7,#4
mov r0,#1
adr r1,to_receive
mov r2,#receive_size
svc #1
@exit with error code from last syscall
mov r7,#1
svc #1
struct:
.ascii "\x02\xff" @AF_INET
.ascii "\x11\x5c" @port 4444
.byte 127,0,0,1 @ip 127.0.0.1
to_receive: .skip 40
after_to_receive:
.set receive_size, after_to_receive - to_receive
在网络连接的另一端,我将nc配置为侦听并将某些文本数据通过管道传输到成功的连接。
网络监听器(服务器)
toybox nc -Lp 4444 < file_to_send.txt
但是,我在客户端的控制台屏幕上看不到任何输出。我怀疑recv系统调用未收到数据,或者我没有正确使用写入系统调用。
我没有看到任何错误消息,所以不确定我是否做对了。任何建议表示赞赏。
我已经单独确认,将另一个nc进程连接到侦听器将检索文本数据。
答案 0 :(得分:0)
使用调试器(例如GDB)和/或strace ./a.out
来跟踪程序执行的系统调用并找出问题所在。 asm程序崩溃或无声无事是正常的,因为对系统调用的错误args通常会导致-EFAULT
,-EINVAL
或-ENOSYS
,而不会引发SIGSEGV或类似的事情。但是除非您编写错误处理代码或使用strace
,否则您将不知道哪个或为什么。
(OP报告说,这样做之后,很明显movw r7,#291
电话号码缺少recv
。)
(修复了调试/跟踪工具显而易见的错误之后):
使用
x/40x $pc
,我看到它全为零,没有任何内容
$pc
是程序计数器r15
。您想要x &to_receive
或x $r1
或其他东西来将内存转储到传递给recv
的静态缓冲区中。
是的,0x1a
返回值应该是字节数。
flags=100
(0x64
)似乎也很奇怪,但是没有任何评论可以解释您想要哪个标志或为什么要用十进制写这些标志。
您甚至根本不需要recv
;您有一个已连接的TCP套接字,并且可能不需要任何标志,因此只需从套接字FD read()
。