tmxklab
[pwnable.kr] ascii_easy 본문
1. 문제확인
ascii_easy@pwnable:~$ ls -l
total 1700
-r-xr-sr-x 1 root ascii_easy_pwn 7624 Nov 3 2017 ascii_easy
-rw-r--r-- 1 root root 1041 Nov 3 2017 ascii_easy.c
-r--r----- 1 root ascii_easy_pwn 52 Aug 6 2014 flag
-r--r----- 1 root ascii_easy_pwn 141 Oct 27 2016 intended_solution.txt
-rwxr--r-- 1 root root 1717736 Oct 27 2016 libc-2.15.so
ascii_easy@pwnable:~$
1) mitigation 확인
2) 문제 확인
3) 코드흐름 확인
3-1) ascii_easy.c
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#define BASE ((void*)0x5555e000)
int is_ascii(int c){
if(c>=0x20 && c<=0x7f) return 1;
return 0;
}
void vuln(char* p){
char buf[20];
strcpy(buf, p);
}
void main(int argc, char* argv[]){
if(argc!=2){
printf("usage: ascii_easy [ascii input]\n");
return;
}
size_t len_file;
struct stat st;
int fd = open("/home/ascii_easy/libc-2.15.so", O_RDONLY);
if( fstat(fd,&st) < 0){
printf("open error. tell admin!\n");
return;
}
len_file = st.st_size;
if (mmap(BASE, len_file, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, fd, 0) != BASE){
printf("mmap error!. tell admin\n");
return;
}
int i;
for(i=0; i<strlen(argv[1]); i++){
if( !is_ascii(argv[1][i]) ){
printf("you have non-ascii byte!\n");
return;
}
}
printf("triggering bug...\n");
vuln(argv[1]);
}
- 인자 하나를 받고 실행하며 주어진 libc파일을 매핑한다.
- argv[1]값은 ascii코드 범위(0x20 ~ 0x7f)안에 있어야 하며 vuln()의 파라미터로 들어간다.
- vuln()에서 범위 값 지정을 안하고 바로 buf에 strcpy를 한다.
- 즉 입력 값에 필터를 걸어놓고 libc를 이용해가지고 문제를 푸는 거 같다.
2. 접근 방법
vuln()에서 strcpy()를 통해 bof가 발생하므로 요걸 이용해서 rop를 해보자.
dest[ebp-0x1c]이므로 dummy값을 0x20만큼 주고 페이로드를 작성하자
3. 문제 풀이
'War Game > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] otp (0) | 2021.06.07 |
---|---|
[pwnable.kr] simple login (0) | 2021.06.07 |
[pwnable.kr] md5 calculator (0) | 2021.01.15 |
[pwnable.kr] brain fuck (0) | 2021.01.14 |
[pwnable.kr] horcruxes (0) | 2020.12.02 |
Comments