일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 러닝 스칼라
- hackerschool
- 파이썬
- 인공지능
- php
- backend
- 리눅스
- Scala
- Python
- c++
- Web
- hacking
- webhacking
- c
- 웹해킹
- 백엔드
- hackthissite
- 딥러닝
- ChatGPT
- BOF
- Linux
- Shellcode
- 경제
- 러닝스칼라
- Javascript
- mysql
- flask
- 챗GPT
- deep learning
- BOF 원정대
- Today
- Total
jam 블로그
[bof 원정대] zombie_assassin -> succubus (calling functions continuously) 본문
[bof 원정대] zombie_assassin -> succubus (calling functions continuously)
kid1412 2012. 3. 29. 13:43/*
The Lord of the BOF : The Fellowship of the BOF
- succubus
- calling functions continuously
*/
#include <stdio.h>
#include <stdlib.h>
#include <dumpcode.h>
// the inspector
int check = 0;
void MO(char *cmd)
{
if(check != 4)
exit(0);
printf("welcome to the MO!\n");
// olleh!
system(cmd);
}
void YUT(void)
{
if(check != 3)
exit(0);
printf("welcome to the YUT!\n");
check = 4;
}
void GUL(void)
{
if(check != 2)
exit(0);
printf("welcome to the GUL!\n");
check = 3;
}
void GYE(void)
{
if(check != 1)
exit(0);
printf("welcome to the GYE!\n");
check = 2;
}
void DO(void)
{
printf("welcome to the DO!\n");
check = 1;
}
main(int argc, char *argv[])
{
char buffer[40];
char *addr;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// you cannot use library
if(strchr(argv[1], '\x40')){
printf("You cannot use library\n");
exit(0);
}
// check address
addr = (char *)&DO;
if(memcmp(argv[1]+44, &addr, 4) != 0){
printf("You must fall in love with DO\n");
exit(0);
}
// overflow!
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// stack destroyer
// 100 : extra space for copied argv[1]
memset(buffer, 0, 44);
memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100));
// LD_* eraser
// 40 : extra space for memset function
memset(buffer-3000, 0, 3000-40);
}
소스 분석
1. buffer의 크기는 40
2. 인자값은 적어도 하나 이상
3. 첫번째 인자값에는 \x40이라는 값 자체가 있으면 안됨.
4. DO 함수의 주소값을 가져옵니다.
5. 첫번째 인자값의 44번째 주소값이 DO의 주소값이 아니면 오류
6. buffer 44크기 만큼 초기화, 48번째부터 100크기 만큼을 건너뛰고 초기화
7. buffer 위쪽 3000크기만큼 초기화(전의 문제에서 LD_PRELOAD를 사용 못하게 하려는 용도)
8. 각 함수(도,개,걸,윷,모)순서대로 접근을 한다음 마지막 모 함수에 cmd를 넣어주어야 합니다.
0. bash2.
1. DO, GYE, GUL, YUT, MO 함수의 주소값, buffer 주소값 구하기
2. bof 공격
1. DO, GYE, GUL, YUT, MO 함수의 주소값, buffer 주소값 구하기
[그림 2] buffer의 주소값
2. bof 공격
함수를 불러야하기 때문에 buffer에 함수 주소값을 넣어서 불러오게 해야합니다.
[buffer 44byte] [DO 함수 주소값] [GYE 함수 주소값] [GUL 함수 주소값] [YUT 함수 주소값] [MO 함수 주소값] [리턴값] [뒤쪽에 써있는 /bin/sh의 주소값] ["/bin/sh"]
0xbffffa70에서 /bin/sh의 주소값을 구해야하는데 72byte 뒤쪽에 있기 때문에 0xbffffab8이 됩니다.
'해킹 > 시스템' 카테고리의 다른 글
[bof 원정대] nightmare -> xavius (fgets, destroyer) (0) | 2012.03.31 |
---|---|
[bof 원정대] succubus -> nightmare (PLT) (0) | 2012.03.31 |
[bof 원정대] assassin -> zombie_assassin (FEBP;fake ebp) (0) | 2012.03.27 |
[bof 원정대] giant -> assasin (no stack, no RTL) (0) | 2012.03.26 |
[bof 원정대] bugbear -> giant (RTL2, only execve) (0) | 2012.03.23 |