容器VS HardBones Syscall使用上的差异[Linux]

时间:2019-04-09 18:22:10

标签: assembly containers 64-bit intel

我不确定在Security Stack溢出时是否会更好,但是因为这涉及代码,并且我可能期望得到代码答案,所以我将在此处编写。

我为Linux编写了一些程序集,它将发出DNS请求并获取响应。 x86版本可以在任何地方使用,但是当我制作了x64版本时,除了在容器中,它还可以在任何地方使用。

我决定深入研究,我注意到如果将请求类型更改为TCP,它也可以满足我的要求。

我调试了一下,发现所有内容都正确设置在堆栈上,但实际上没有任何请求发出。尽管可以在裸机上运行,​​但代码是否应该以不同的方式编写?或者是否有通常用于阻止UDP SEND调用的限制。

编辑: 我正在Linux x64 ubuntu上工作。我可以显示TCP转储正常工作的问题,但问题是,当它不工作时,根本没有流量。没有数据包发送。

Edit2:

  

这是容器上的寄存器,用于保存发送后的返回。

rax            0xffffffffffffffa1   -95
rbx            0x0  0
rcx            0xffffffffffffffff   -1
rdx            0x20 32
rsi            0x7fffffffe2b8   140737488347832
rdi            0x7  7
rbp            0x0  0x0
rsp            0x7fffffffe2b0   0x7fffffffe2b0
r8             0x7fffffffe2b0   140737488347824
r9             0x10 16
r10            0xd  13
r11            0x346    838
r12            0x5555555544f0   93824992232688
r13            0x7fffffffe3b0   140737488348080
r14            0x0  0
r15            0x0  0
rip            0x555555554668   0x555555554668 <main+104>
eflags         0x246    [ PF ZF IF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0
  

在发送系统调用后在物理计算机上

(gdb) info registers
rax            0x20 32
rbx            0x0  0
rcx            0x555555554668   93824992233064
rdx            0x20 32
rsi            0x7fffffffdda8   140737488346536
rdi            0x3  3
rbp            0x5555555546e0   0x5555555546e0 <__libc_csu_init>
rsp            0x7fffffffdda0   0x7fffffffdda0
r8             0x7fffffffdda0   140737488346528
r9             0x10 16
r10            0x2  2
r11            0x246    582
r12            0x5555555544f0   93824992232688
r13            0x7fffffffdea0   140737488346784
r14            0x0  0
r15            0x0  0
rip            0x555555554668   0x555555554668 <main+104>
eflags         0x246    [ PF ZF IF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0

>

section     .text
global      main   ;must be declared for linker (ld)



;The Message We want to send.
;AA AA 01 00 00 01 00 00 00 00 00 00 0A 72 6f 6f 74 6b 69 74 64 65 76 03 63 6f 6d 00 00 01 00 01


   ;DNS HEADER;
   ; AA AA - ID
   ; 01 00 - Query parameters
   ; 00 01 - Number of questions
   ; 00 00 - Number of answers
   ; 00 00 - Number of authority records
   ; 00 00 - Number of additional records
   ; DNS QUESTION --
   ; 07 - 'example' has length 7, ;so change this to be the length of domain ; keep in mind there are not '.' in the question.
   ; 65 - e
   ; 78 - x
   ; 61 - a
   ; 6D - m
   ; 70 - p
   ; 6C - l
   ; 65 - e

   ; 03 - subdomain '.com'  length 03  ; change this to be the length of type.

   ; 63 - c
   ; 6F - o
   ; 6D - m

   ; 00    - zero byte to end the QNAME 
   ; 00 01 - QTYPE 
   ; 00 01 - QCLASS

   ; DNS ANSWER!
   ; aa aa
   ; 81 80
   ; 00 01
   ; 00 01
   ; 00 00
   ; 00 00
   ; 07 65
   ; 78 61
   ; 6d 70
   ; 6c 65
   ; 03 63
   ; 6f 6d
   ; 00 00
   ; 01 00
   ; 01 c0
   ; 0c 00
   ; 01 00
   ; 01 00
   ; 00 12
   ; 8d 00
   ; 04 

   ; IP ADDRESS IN HEX -- 93.184.216.34
   ; 5d
   ; b8 
   ; d8
   ; 22



main:

        mov rax, 41                                ;Create Socket
        mov rdi, 2                                 ;AF_INET
        mov rsi, 2                                 ;Sock_DGRAM
        mov rdx, 0                                 ;flags
        syscall                                    ;CALL SYSCALL CREATE SOCKET ; Looks good!

        mov rdi, rax                            ; sockfd
; ####################### DNS REQUEST

mov rax, 0x0000000100010000
push rax 
mov rax, 0x6d6f6303656c706d
push rax 
mov rax, 0x6178650700000000
push rax 
mov rax, 0x000001000001AAAA
push rax 

; ############################### 

        mov rsi ,rsp
        mov rdx, 32 ; len of bytes    ; Google IP  port 53  INET Family       
        mov rax, 0x0101010135000002   ; 8.8.8.8.8 - 0x35 - 00 00 02 
        push rax
        mov rax, 44                             ; Send Syscall

        mov r8, rsp
        mov r9, 16
        syscall  ; This never Actually sends in containers for some reason.


; Now need to read the response!

        xor rax, rax   ; read syscall == 0x00
        push 100        ; Set out bytes to response to be higher!
        pop rdx         ; rdx = input size
        sub rsp, rdx
        mov rsi, rsp    ; rsi => buffer
        syscall

        add rsp, rax ; This will give us the top of the stack where the answer is stored.
        sub rsp, 0x4 ;
        mov rax, [rsp]
        mov ebx, eax 
        mov rax, rbx

0 个答案:

没有答案