RTL을 DAY-6에서 봤다.
이번에는 RTL Chaining기술에 대해서 알아 볼 것이다.
RTL Chaining은말 그대로 RTL을 연속적으로 사용해서 공격하는 것 이다
그럼 알아보도록하자.
소스코드는
#include <stdio.h>
#include <stdlib.h>
void call_system(char *arg){
system(arg);
}
void get_message(char msg[]){
char admin[128];
read(0,msg,512);
memcpy(admin,msg,512);
}
int main(void){
char id[20];
char pw[256];
char message[512];
setvbuf(stdout, 0, _IONBF, 0);
write(1,"ID:",3);
read(0,id,20);
write(1,"PW:",3);
read(0,pw,256);
printf("Hello! %s\n",&id);
printf("Input your message to admin.\n");
get_message(message);
printf("Your Message Is %s\n",&message);
printf("Thank you!\n");
}
2017/11/02 - [SYSTEM HACKING/정리자료] - DAY-4 프로세스 디버깅
(DAY-6참조)
{
[낮은 주소값 = 높은주소] [높은 주소값 = 낮은주소]
AAAAAAAAAAAAAA BBBB read(주소) 리턴값 "0" "공간 주소(bss)" "넣을 양" "원하는 함수" "리턴값" "인자"
[buffer] [saved ebp] [saved eip] [return값] [read인자]x3 [함수 주소] [return값] [인자]
이렇게 있다고 치자
read는 실행이 될 것이다.
그후 return 값에 pop을 세번해주는 코드의 주소값을 넣으면 어떻게 될까?
위에서 보이듯이 0,공간,넣을양이 pop되서 빠질 것이고
원하는 함수가 실행될 것이다.
이런식으로 실행을하는 것이 RTL Chaining이다.
그럼 한번 해보겠다.
pop을 세번 해준다.
그럼 원하는 함수인 system을 실행시킬수 있을것이다.
정리를 해보자.
A를 140개를 채워서 saved ebp까지 채운후
.
saved eip에 read 함수의주소 \xf0\x3a\xee\xf7을 넣어준다.
.
return값에는 pop을 세번하는 주소 \xf9\x86\x04\x08을 넣어주고
.
read 인자에는 0을넣어주고 \x00\x00\x00\x00
공간주소에는 \x3c\xa0\x04\x08라는 적당한 공간의 주소를 넣어주겠다.
넣을양은 \xff\xff\xff\xff로 하겠다.
.
system 함수의 주소 \xa0\x8d\xe4\xf7를 넣어주고.
system 함수의 리턴값은 "RETA"로 한후
인자는 \x3c\xa0\x04\x08 read함수에서 받은 값으로 하겠다.
(함수의 주소는 바뀔수 있으니 알아보고 하자.)
한번 실행을 해보자.
정말로 SUCCESS라는 파일이 만들어져있는지 확인해보자.
SUCCESS파일이 확인되었다.
이상으로 RTL Chaining을 끝맞추겠다.
'SYSTEM HACKING > 기법' 카테고리의 다른 글
DAY-8 FSB(Format String Bug) (0) | 2017.12.31 |
---|---|
DAY-7 ROP(Return Oriented Programming) (0) | 2017.11.18 |
DAY-6 Return To Library (0) | 2017.11.11 |
DAY-5 쉘코드 작성 (0) | 2017.11.10 |
DAY-4 프로세스 디버깅 (0) | 2017.11.02 |