티스토리 뷰
RTL이란 Return To Libc 라는 기법으로 libc에 들어있는 함수를 불러와 실행시키는 방법이다.
PLT와 GOT에 대해 알아야 하는데
https://watchout31337.tistory.com/152
여기서 알아보자.
rtl은 libc에 있는 함수의 주소를 이용해서 실행중인 코드에 존재하지 않는 함수를 사용할 수 있다.
이 방법으로 스택이나 힙에서 쉘 코드 실행을 막아주는 dep을 우회할 수 있다. 쉘 코드를 실행할 필요 없이 함수 자체를 불러오는 방법으로.
이런 간단하지만 취약점이 있는 코드를 보자.
strcpy함수로 argv[1]을 buf로 복사했다.
하지만 길이를 체크하지 않기 때문에 취약점이 발생한다. buf의 크기인 128을 넘어 sfp와 ret를 조작할 수 있다.
이렇게 실행하면
이렇게 나온다.
gdb로 열어 확인해 보면
main+57에서 ebp-8c가 buf의 위치이다. 그럼 12만큼의 더미가 있다는 의미이다.
buf[128]+dummy[12]+sfp[4]+ret[4] 이렇게 생겼다.
rtl을 이용해 ret를 조작해보자.
rtl의 모양을 보면
system함수의 주소[4]+dummy[4]+인자[4]
이런 모양이다.
중간의 dummy는 system함수의 ret라고 생각하면 된다.
rtl을 여러개 묶어 사용할 때, 즉 여러 함수를 사용할 때 dummy대신 다른 함수의 주소를 넣으면 된다.
그럼 system("ls")이런 함수를 실행해보도록 하자.
system 주소를 찾는 방법은 실행중인 프로그램에서
p system을 사용하면 된다.
이렇게 주소가 0xf7e3dd0이 출력된다.
이 주소는 고정된 주소가 아니다. libc base주소가 계속 변하기 때문에 offset을 구해 진짜 위치를 찾아야 한다.
system함수의 주소는 위에서 구한대로 이고,
인자 ls를 넣어야 한다.
'포너블 > 포너블 공부' 카테고리의 다른 글
[dreamhack] SSP_000 (0) | 2021.01.22 |
---|---|
SSP(canary) (0) | 2021.01.18 |
ROP에 대해 (0) | 2021.01.02 |
pwntools 이용하기 (0) | 2020.12.01 |
PLT(Procedure Linkage Table),GOT(Global Offset Table) (0) | 2020.09.15 |
- Total
- Today
- Yesterday
- 크로스 엔트로피
- cuckoo
- many-to-many
- 로지스틱회귀
- 케라스
- Python
- automotive ethernet
- 회귀
- json2html
- 이상탐지
- AVTP
- CAN-FD
- 머신러닝
- AE
- one-to-many
- SOME/IP
- porks
- 논문 잘 쓰는법
- PCA
- SVM
- problem statement
- 단순선형회귀
- many-to-one
- Ethernet
- AVB
- HTML
- 차량 네트워크
- 차량용 이더넷
- 딥러닝
- automotive
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |