einefache socket uns asm...
-
hallo,
ich habe ein stück Code gefunden..Section .text .Global _start _start: #Sock = socket(2,1,0); xor %eax,%eax xor %ebx,%ebx xor %ecx,%ecx movb $0x66,%al #Syscall ID (socketcall) em eax movb $0x1,%bl #Function ID (socket) em ebx push %ecx #Montando push $0x1 #Parametros push $0x2 #Da funcao socket movl %esp,%ecx #em ecx int $0x80 #Chama Kernel mov %eax,%esi #newSock retornado de socket() em esi # hostAddr #bind(Sock,[2,8089,0], 16); xor %eax,%eax xor %ebx,%ebx xor %edx,%edx movb $0x66,%al #Syscall ID (socketcall) em eax movb $0x2,%bl #Function ID (bind) em ebx push %edx #0x00 pushw $0x1F99 #8089 push $0x2 #2 movl %esp,%ecx #Salvando ^^ push $0x10 #sizeof(hostAddr); push %ecx #(struct sockaddr *)&hostAdd push %esi #Sock movl %esp,%ecx #Salvando em ecx int $0x80 #Chama Kernel #listen(Sock,4); xor %eax,%eax xor %ebx,%ebx movb $0x66,%al movb $0x4,%bl push $0x4 push %esi movl %esp,%ecx int $0x80 #newSock = accept(sock,0,0); xor %eax,%eax xor %ebx,%ebx xor %edx,%edx movb $0x66,%al movb $0x5,%bl push %edx push %edx push %esi movl %esp,%ecx int $0x80
tomycat@linux-a4gd:~/test> sudo as -o code.o code.s
tomycat@linux-a4gd:~/test> sudo ld -o code code.o
tomycat@linux-a4gd:~/test> ./code
// Programm wartet....Auf einer anderen Console habe ich folgendes eingetippt:
sudo netstat -lp | grep 8089
...dann kommt keine Antwort.
was mache ich falsch?
Wie kann den Fehler eingrenzen?
-
tomycat2009 schrieb:
Wie kann den Fehler eingrenzen?
Man könnte mit
strace
prüfen, ob die Systemaufrufe wie gedacht aufgerufen werden und ob sie Fehler zurückgeben. Dazu das Programm mitstrace
starten:strace ./code
strace
hat noch nützliche Parameter, schau dazu die Hilfe an,strace --help
o.ä.
Ansonsten habe ich Assembler-Code nur überflogen und habe es mit Lesen sein lassen, weil Kommentare unverständlich, keine Leerzeichen, zu viele Leerzeilen - bin müde und alt, keine Lust sich anzustrengen.
Was noch merkwürdig ist, das Programm wird als sudo gebaut...
-
ok,thx.
tomycat@linux-a4gd:~/hack2> sudo strace ./nurs
root's password:
execve("./nurs", ["./nurs"], [/* 16 vars */]) = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
bind(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("153.31.0.0")}, 16) = -1 EADDRNOTAVAIL (Cannot assign requested address)
listen(3, 4) = 0
accept(3, <------ hier ist Ende GeländeAF_INET kenne ich, aber nicht PF.INET ?!
sollte nicht bei htons(8098) drin sein?
Meine IP ist 192.168.2.22 diese ist fest.
-
tomycat2009 schrieb:
AF_INET kenne ich, aber nicht PF.INET ?!
sollte nicht bei htons(8098) drin sein?Alle Parameter müssten doch im Quellcode zu finden sein. Ausserdem, wie man sieht, gibt es einen Fehler beim Systemaufruf
bind
, warum auch immer. Man sieht auch, dass es keine Fehlerbehandlung gibt - es macht keinen Sinn zu schauen, ob die Systemaufrufe danach ok sind. Die Fehlerbehandlung muss unbedingt rein, auch wenn der Code in Assembler geschrieben ist.
Abgesehen davon ist so etwas hier:tomycat2009 schrieb:
accept(3, <------ hier ist Ende Gelände
suboptimal (sprich: Scheiße). "hier ist Ende Gelände" sagt mir nichts und es fehlt die Hälfte. Bitte vollständig "copypasten", sonst macht es keinen Sinn.
-
thx,
die parameter habe ich schon gefunden, aber ich habe nur eine kleine Auswahl.
ich nehme an bind ist hier das Problem.
Er gibt mir ja auch -1 zurück.htons(8098) <--- das wunder mich auch, laut Quellcode sollte das auch so sein.
accept(3,<---- danach kommt nicht mehr.
ich check alles noch mal