2014-12-04 1 views
0

오늘 ASM을 재미있게 배우기 시작했고, 내가 알아 내려고하는 것 중 하나는 ASM에서 TCP 연결을 여는 방법입니다. 복잡한 데이터 구조가 없기 때문에push 또는 스택에 syscall 레지스터에 sockaddr을 스택에 저장해야합니까?

나는() 아래로 소켓에 전화를 가지고와 난 그냥 위해 무엇을 해야할지 모르겠어,

그러나 레지스트리의 값을 저장할 수 있습니다 그것은이 시점에서 SOCKADDR

; socket() 
    mov  rax, 41 
    mov  rdi, 20  ; AF_INET 
    mov  rsi, 1  ; SOCK_STREAM 
    mov  rdx, 0  ; Protocol 
    syscall 

    ; Valid socket? 
    cmp  rax, 0 
    jle  error 

    ; connect() 
    mov  rdi, rax ; rax stores fd, save into rdi before moving rax to syscall id 
    mov  rax, 42 
    mov  rsi, 

에 대한 포인터를 필요로하기 때문에 오픈() 시스템 콜, 나는 내가 어떻게해야 해요 무엇인지 amn't. 그냥 값을 스택으로 푸시합니까?

+0

먼저 "레지스트리"가 아닌 * registers *에 값을 저장합니다. 어셈블리에서 소켓을 사용하는 방법은 [이 질문] (http://stackoverflow.com/questions/19850082/using-nasm-and-tcp-sockets)에서 몇 가지 답변을 얻을 수 있습니다. 64 비트가 아닌 32 비트이지만, 사용자가하려는 것처럼 보입니다. –

+1

'c'에 코드를 작성한 다음 asm 출력을 생성하고 그 모양을 볼 수 있습니다. –

+0

컴파일러에 따라 어셈블리에'struct' 정의가 있습니다. 예를 들어'NASM/YASM'은'struct ... endstruct'를 사용하고 MASM은'name struct ... name ends'를 사용합니다. –

답변

0

하나의 옵션은 스택에 sockaddr_in 구조를 추진하는 것입니다 사전에

덕분에, 그 구조의 시작 주소로 rsi를 설정합니다.

확실하지는 않지만 sockaddr_in을 역으로 밀어 넣어야합니다. 스택이 작아 지지만 connect은 구조가 낮은 주소에서 시작하여 높은 주소로 끝날 것으로 예상합니다.

그렇다면, 이런 일 :

  1. 길게 누름 (32 비트)가 0, (sin_zero [8])
  2. 푸시 길이 (32 비트)의 인터넷 주소 (예 3,232,235,777 32 -bit decimal form, dotted-quad에서 192.168.1.1과 동일 함). RSI에서 ESP의
  3. 푸시 짧은 (16 비트)를 포트 (예 80)
  4. 푸시 짧은 20 (AF_INET)
  5. 입력 값
  6. 통화 연결 (구조체 시작되는 짧은 (20)를 가리)

두 번째 예는 두 번째 예제입니다. gcc가 만든 작은 예제를 보려면 connect()을 사용합니다.