목록Pwnable.kr/Rookiss (17)
Pwnstar
이야 이문제도 참 오래 걸렸는데 학교 선배께서 이 문제랑 syscall은 라이트업을 보면서 공부하는 느낌으로 풀라고 하셔서 그렇게 풀었다... 근데 이런 방법으로 푸는 문제일줄은 상상도 못했다. 우선 mitigation은 canary와 nxbit가 걸려있다. 소스코드 #include #include #include #include int main(int argc, char* argv[]){ char fname[128]; unsigned long long otp[2]; if(argc!=2){ printf("usage : ./otp [passcode]\n"); return 0; } int fd = open("/dev/urandom", O_RDONLY); if(fd==-1) exit(-1); if(read(f..
pwnable.kr 문제를 통해서 kernel exploit에 대해 공부해보려고 한다. 소스코드 // adding a new system call : sys_upper #include #include #include #include #include #include #include #include #define SYS_CALL_TABLE 0x8000e348 // manually configure this address!! #define NR_SYS_UNUSED 223 //Pointers to re-mapped writable pages unsigned int** sct; asmlinkage long sys_upper(char *in, char* out){ int len = strlen(in); int i;..
이 문제는 꽤 오래 전에 풀었던 문제인데 익스가 날아가서 다시 풀어보며 라업을 쓰려고 한다. 문제 이름대로 fsb를 이용해 푸는 문제였던 것으로 기억한다. 소스코드 fsb.c #include #include #include unsigned long long key; char buf[100]; char buf2[100]; int fsb(char** argv, char** envp){ char* args[]={"/bin/sh", 0}; int i; char*** pargv = &argv; char*** penvp = &envp; char** arg; char* c; for(arg=argv;*arg;arg++) for(c=*arg; *c;c++) *c='\0'; for(arg=envp;*arg;arg++) f..
tiny_easy 아마 1월?? 쯤에 풀었던 문제인데 그 당시 대체 무슨 문제인지 감도 못잡다가 거의 일주일만에 그것도 도움을 받아서 간신히 푼 문제이다. 우선 보호기법은 보다시피 NX bit 가 걸려있어서 쉘코드를 실행시키지 못할 것처럼 보인다 그런데 스택 영역의 권한을 보면, stack 영역에 모든 권한이 다 주어져있다. 정말 웃기는 문제이다. 아무튼 이제 무슨 문제인지 대충 보려고 실행시켜보았는데, 실행시키자마자 중지된다. 이게 대체 왜 이런건지 코어파일을 뜯어봤는데, eip가 음...뭔가 아스키코드 같은 값으로 덮여있다. 이 값이 뭔지 찾아봐야했다. 스택을 뒤지던 도중, 보니까 저 빨간 화살표가 있는 부분과 같다. 아 보니까 환경변수가 들어가는 공간이다... 저 부분을 보고 들었던 생각이 그러면 ..
루키스 문제들 복습할 겸 해서 얼른얼른 라이트업을 써 놔야겠다. 게임과 같은 형태로 되어있다 IDA로 보면 이렇게 단순하게 되어있고 PlayGame 함수는 요래 되어있다. 이 문제가 정말 친절한게 secretlevel이라고 쉘따는 부분까지 친절하게 준다. 뭐 이 부분으로 뛰면 될 것 같고, 우선 본론으로 가서 취약점은 엄마 드래곤의 체력에서 발생한다. 이 부분을 보면 v5는 바이트형이다. 그래서 범위가 -128 ~ 127까지 인데 우리는 프리스트가 공격하는 부분을 보면 드래곤이 스스로 피를 회복하는 것을 알 수 있다. 그러니까 우리는 holyshield스킬을 이용해서 살아남고 clarity 스킬을 이용해서 부족한 마나를 가끔 채워주면 용이 스스로 피를 회복하다가 127을 넘는 순간 용을 잡을 수 있을 것..
풀 때 애를 많이 먹었던 문제이다. 소스코드 #include #include #include #include #include #include #define BASE ((void*)0x5555e000) int is_ascii(int c){ if(c>=0x20 && c
이번 문제는 32비트에 카나리와 nx bit가 걸려있다. IDA로 분석해본 결과 canary는 ebp-0xc에 위치해 있으며 처음에 입력받는capcha의 계산에도 쓰인다. 즉, capcha의 값을 역연산하여 canary의 값을 구할 수 있다. 또한 입력은 1024바이트만큼 가능한데, 전역변수에 입력받은 값을 base64로 decode 해서 로컬변수에 저장하는 과정에서 사이즈 차이 때문에 오버플로우가 발생할 수 있다. 우선 오버플로우를 일으키기 위해서 기본적으로 알아야하는 카나리의 값을 구해보자. 위의 식을 역연산하면 canary = capcha - v6 + v8 - v9 - v4 + v5 - v3 - v7 이 될 것이다. 우선 이 배열들은 이 함수들을 통해서 가져온 랜덤 값이므로 동일한 코드를 짜서 값을..
simple login이라는 문제이다. 바이너리를 받을 수 있는 링크가 하나 있으니 받아서 IDA로 열어보자 main 함수는 이렇게 되어있다. auth(v7) == 1이면 correct 함수가 호출되는데, 역시나 쉘을 실행시켜주는 함수였다. 이 문제를 약 1년 전에 낑낑대면서 풀었는데 그때의 접근 방법으로 한번 풀어보도록 하겠다. 우선 메인 함수를 보면 입력 값을 base64 decode해서 첫 네 바이트가 input이라는 전역변수에 들어간다. 그리고 correct 함수에 보면 input은 -559038737이 되어야 하는데, 16진수로 0xDEADBEEF이다. 우선 이 값을 넣어주기 위해 첫 4바이트는 0xDEADBEEF를 넣어줘야할 것 같다. 이제 auth(v6) == 1을 맞춰주기 위한 조건이 무엇..