我不确定在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