
1. PLT와 GOT
1) PLT(Procedure Linkage Table)
외부 라이브러리의 프로시저를 연결해주는 테이블.
puts 함수를 실행하려고 하면 puts함수는 puts@plt로 점프한다. (call puts@plt)
plt에서는 got를 통해 함수의 실제 주소에 접근한다. (jmp qword ptr[rip+0x2fca])
이때 puts 함수안에 있는 _dl_runtime_resolve_fxsave라는 함수를 통해 구해진 뒤 비로소 실제 함수 주소가 got에 저장된다. 이 과정 전까지는 puts@plt+6으로 저장된다. 이 과정을 "runtime resolve"라고 한다.
2) GOT(Global Offset Table)
PLT가 참조하는 테이블로 프로시저들의 주소가 들어있다.
2. RTL(Return To Libc)
nx bit 가 적용된 스택을 우회하기 위해 사용.
가젯을 사용해 스택과 리턴 주소를 바꿔줄 수 있다.
| stack까지 채우기 |
| pop ret |
| parameter |
| return address |
여기서 parameter를 /bin/sh, return address로 해주면 system함수 주소로 바꿔주면 쉘코드 대신 외부 라이브러리의 system을 "/bin/sh"를 인자로 호출함으로써 쉘을 딸 수 있다.
3. ROP(Return Oriented Programming)
1) 원하는 함수 주소 구하기
만약 recv함수가 이미 실행되었다고 했을 때,
페이로드를 이렇게 구성해주면
| stack까지 채우기 |
| send_plt |
| fd |
| recv_got |
| 4 |
| 0 |
plt에서는 return addresss-parameter1-parameter2-parameter3.. 순서로 진행되어 send(fd,recv_got,4,0) 이렇게 된다. 이부분은 함수 호출 규약에 따라 다를 것이다.
위 페이로드대로 구성해주면 recv_got의 주소를 받을 수 있다.
2) 구한 주소로 RTL chaining 하기
| stack 까지 채우기 |
| recv_plt |
| ppppr |
| fd (입력 값) |
| bss (bss에 넣기) |
| len(cmd) |
| 0 |
| return address=>system |
| bss |
이렇게 하면
recv(fd,bss,len(cmd),0)
system(bss)
이렇게 실행될 수 있다.
'이예은' 카테고리의 다른 글
| lua 문법과 lua에서 발생할 수 있는 취약점 (0) | 2025.01.12 |
|---|---|
| 파일 시그니처 분석 (0) | 2024.11.15 |
| Bindiff 활용해서 Binary Diffing하기 (0) | 2024.11.01 |

stellarflare 님의 블로그 입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!