Сборка ARM по использованию recv syscall - PullRequest
0 голосов
/ 28 июня 2019

Я начинаю узнавать о сборке ARM из https://azeria -labs.com / writing-arm-shellcode / и хочу попрактиковаться в получении данных из сокета.Это фрагмент кода того, что я изучаю до сих пор.Тестирование выполняется на мобильном устройстве.

Код сетевого клиента

    @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 не получает данные, либо я неправильно использую системный вызов write.

Я не вижу сообщений об ошибках, поэтому не уверен, правильно ли я это делаю.Любой совет приветствуется.

Я отдельно подтвердил, что подключение другого процесса nc к слушателю приведет к получению текстовых данных.

1 Ответ

0 голосов
/ 28 июня 2019

Используйте отладчик (например, GDB) и / или strace ./a.out, чтобы отследить системные вызовы, которые делает ваша программа, и выяснить, что не так. Это нормально для asm-программ, которые либо аварийно завершают работу, либо молча делают ничего, потому что неправильные аргументы системного вызова обычно приводят к -EFAULT, -EINVAL или -ENOSYS, не вызывая SIGSEGV или что-то в этом роде. Но вы не будете знать, что и почему, если не напишите код обработки ошибок или не используете strace.

(ОП сообщает, что после этого было очевидно, что для номера вызова recv пропущен movw r7,#291.)


(после исправления этой ошибки, которую делают средства отладки / трассировки):

с использованием x/40x $pc Я увидел, что все нули с заполнением ничего не заполнены

$pc - счетчик программ, r15. Вы хотите, чтобы x &to_receive или x $r1 или что-то еще дамп памяти в статическом буфере, который вы передали recv.

Да, возвращаемое значение 0x1a должно быть числом байтов.

flags=100 (0x64) также кажется странным, но нет комментариев, объясняющих, какие флаги вы хотите или почему вы пишете их в десятичном виде.

Вам даже не нужно recv во-первых ; у вас есть подключенный сокет TCP и, возможно, вам не нужны какие-либо флаги, поэтому вы можете просто read() из сокета FD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...