이번에는 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 |