关于使用recv syscall的ARM汇编

时间:2019-06-28 02:16:16

标签: android assembly arm

我开始从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进程连接到侦听器将检索文本数据。

1 个答案:

答案 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_receivex $r1或其他东西来将内存转储到传递给recv的静态缓冲区中。

是的,0x1a返回值应该是字节数。

flags=1000x64)似乎也很奇怪,但是没有任何评论可以解释您想要哪个标志或为什么要用十进制写这些标志。

您甚至根本不需要recv ;您有一个已连接的TCP套接字,并且可能不需要任何标志,因此只需从套接字FD read()