이전 포스팅
2023.11.09 - [시스템해킹] - [LAZENCA] ROP-x64 part.1
[LAZENCA] ROP-x64 part.1
참고 자료 https://www.lazenca.net/display/TEC/02.ROP%28Return+Oriented+Programming%29-x64 02.ROP(Return Oriented Programming)-x64 - TechNote - Lazenca.0x0 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x64
yi-barrack.tistory.com
참고자료
https://www.lazenca.net/display/TEC/02.ROP%28Return+Oriented+Programming%29-x64
02.ROP(Return Oriented Programming)-x64 - TechNote - Lazenca.0x0
Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x64 ROP( Return-oriented programming )는 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태
www.lazenca.net
오늘의 실습 코드는
rop.c
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>
void vuln(){
char buf[50];
void (*printf_addr)() = dlsym(RTLD_NEXT, "printf");
printf("Printf() address : %p\n",printf_addr);
read(0, buf, 256);
}
void main(){
seteuid(getuid());
write(1,"Hello ROP\n",10);
vuln();
}
이고요 (당연히 rop.c 빼고 작성해야하는거 알겠지 저거 때문에 오류난다고 하면 힘들어요)
컴파일은 gcc -fno-stack-protector -o rop rop.c -ldl 로 하자.
이후 해당 파일의 소유자와 그룹은 root으로 하고 ($ sudo chown root:root ./rop)
setuidbit 설정과 권한 부여를 해준다. ($ sudo chmod 4755 ./rop)
해당 lazenca 사이트에선 이렇게 하라고 했지만... 저는... pwndbg로 디버깅 할거기 때문에... 파일 소유자가 제가 아니면 안되더라구요.... 혹시나 안되는 사람 있으면 일단 익스 전까지는 chown을 본인걸로 하세용
PIE
일단 디버깅 전에 우리가 알아야 할 정보가 있다.
현재 이 파일은 PIE가 설정되어있다. 그말은 즉슨 매번 libc의 베이스 주소가 바뀌고, 함수의 주소가 바뀌어서 내가 아무리 system 주소를 알고 gadget 주소를 찾아도 다음에 실행하려고 하면 이상한 곳을 실행하게 된다는 뜻이다... ㅂㄷㅂㄷ
하지만 위의 코드를 보면 "매우 매우 친절하게도" printf 함수의 주소를 출력해준다!!!
"?? 이게 왜? " 하시는 분들이 있다면 이 줄부터는 쓲쓲 읽지 말고 잘 들어보자.
여러분의 키는 발바닥부터 머리까지. 이건 변함없는 사실이다. 땅으로부터 머리까지의 길이를 안다면 어떤 땅에서도 "아 내머리가 여기 있겠구나" 알것이다.
하지만 땅의 높이가 일정한가?
계단을 올라가면 땅으로부터(계단 시작점) 머리 위치는 달라진다.
눈을 감았다 뜰때마다 렌덤한 계단에 서있는다면 여러분은 머리 위치가 어디에 있을지 예상할 수 있나?
없을것이다....
하지만 계단의 높이는 안줘도 어깨의 높이를 알려준다면? 우리는 계단의 높이 뿐만 아니라 머리의 위치 까지 알 수 있다.
이러한 어떤 기준들의 차이를 offset이라고 하고, 이러한 offset을 이용하면 상대적으로 어떤 위치에 어떤 값이 있겠다고 계산할 수 있다. 물론 이때의 조건은 어깨의 위치를 알려줬을때.
자 그러면 본래 문제로 돌아와서 printf의 주소를 알려주는게 엄청난 힌트라는것을 알 수 있다.
왜냐하면 printf함수는 libc의 베이스주소 + 특정 거리에 존재할 것이다. 그렇다는 것은 아무리 베이스 주소가 변해도 특정 거리(offset)만 알면 printf 주소 - 특정거리 = libc의베이스주소 라는 것을 알 수 있다. 이를 이용해서 다른 함수들의 위치를 구할 수 있다!
알아야 할 정보들
그러면 이제 이 문제를 익스하기 위해서 어떤 값들이 필요할까?
1. vuln 함수의 return 주소를 덮어 씌울 수 있도록 ret 까지의 거리.
2. 권한을 얻기 위한 동작
이 필요하다. 이중 2번 권한을 얻기 위한 동작은
setresuid (0,0,0)
system(/bin/sh)
로 실행할 것이다. 우분투에서는 setresuid로 euid, ruid 등등 을 비교하고 이게 일치하면 시켜준다고 한다.(야매로 말한거라 찾아보는게 혈압과 인생에 이득이 될 것이다.)
다시 정리하면 알아야 할 정보는
1. vuln 함수의 ret 주소의 위치차이(offset)
2. printf 함수 위치(offset을 구하기 위해. 어깨높이)
3. setresuid 함수 위치
4. system 함수 위치
5. 가젯의 위치
라고 할 수 있다.
다음 포스팅에선 해당 값들을 찾아 보도록 하자ㅑ
'시스템해킹' 카테고리의 다른 글
[LAZENCA] ROP-x64 part.4 (2) | 2023.11.09 |
---|---|
[LAZENCA] ROP-x64 part.3 (0) | 2023.11.09 |
[LAZENCA] ROP-x64 part.1 (1) | 2023.11.09 |
드림핵 off_by_one_000 writeup (0) | 2023.11.02 |
SSTF bof101 writeup (1) | 2023.11.02 |