본문 바로가기

ARM아키텍쳐

[ARM] exploit RTL Chaining

이번에는 RTL 기법으로 여러 함수를 호출하여 마치 사슬에 사슬을 물듯이 이어지는 exploit에 대해 공부 해보겠다.

여러 블로그나 자료에 나온 ARM exploit에 관한 설명이 나는 이해가 가지 않아 직접 내 생각을 정리 했다.

생초보의 글이니 지나가다 이 글을 발견하면 가볍게 읽기 바랍니다.

 

 

 

 

다음과 같은 코드로 공부 했다. 물론 RTL이니 ASLR은 없다고 가정한다.(/proc/sys/kernel/randomize_va_space 에 0을 저장한다.)

 

 

엄청 단순한 코드다.

여기서 RTL chaining은 함수를 연계하는 것이다. 여기서 read()함수와 system()함수 그리고 exit()함수를 연계 하고자 한다.

 

필요한 정보는 각 (함수들의 주소)와 ("/bin/sh"문자열을 저장 시켜줄 영역), 그리고 (가젯)들이 필요하다. ARM 환경에서는 리턴이나 함수의 인자들을 넣어줄 때 하나하나 모두 레지스터를 통해 이동한다.

 

 

그럼 먼저 함수의 주소를 먼저 구해보자.

 

read=0x76f30858

system=0x76ea39c8

exit=0x76e99780

 

다음과 같이 나왔다.

그리고 "/bin/sh"문자열을 써줄 메모리 공간을 찾아야 하는데 이 메모리 공간은 쓰기 권한은 있어야 하지만 주소가 바뀌지 않을 공간이어야 한다. 이런 공간으로는 보통 .bss나 .dynamic 영역이 있다. 나는 .bss영역에 "/bin/sh"문자열을 쓰고자 한다.

 

readelf -S 실행파일_이름 명령어로 .bss의 주소는 0x0002102c라는 것을 알 수 있다.

 

이제 여기서 중요한 점이 read()함수로 .bss영역에 "/bin/sh"문자열을 써야 한다는 것이다. 그리고 system함수를 호출하여 그 인자값으로 .bss의 주소를 전달하면 쉘이 실행 될 것이다.

 

어떻게 쓸까?--> 이건 일단 두고보고

 

read(0,.bss의 주소,0x8)의 인자를 전달해주려면 pop {r0,r1,r2,pc}를 찾아야 한다. 행복하다. 한번 이 가젯들을 찾아 보자.

 

그런데 어떻게 ARM 환경에서 함수의 꼬리를 물고 나아가는 chaining을 할 수 있을까?

'ARM아키텍쳐' 카테고리의 다른 글

[ARM] roplevel2  (0) 2020.06.26
[ARM] ROPlevel1  (0) 2020.05.04
[ARM] Hello World!_Part 2  (0) 2020.01.13
[ARM] Hello World!_Part 1  (0) 2020.01.08
[ARM] exploit_RTL  (0) 2019.12.22