Lord of BOF bugbear
Lord of BOF bugbear -> gaint
- H3X0R 팀 소속 ch4n3 -
이 문제는 내가 지금까지 풀었던 문제(물론 포너블만)중에서 가장 오랜 시간을 들여서 푼 문제이다. 계속 C언어를 공부하지 않아서 C언어 코드를 해석하는데에 생각보다 많은 시간을 할애하게 되었다.
일단 소스코드를 보자
일단 소스코드를 보자, 길다. 한눈에 봐도 지금껏 봐오던 소스하고는 길이가 다르다.
C언어 소스가 이해되지 않는 분들을 위해서 해석해주도록 하겠다.
char buffer[40];
FILE *fp;
char *lib_addr, *execve_offset, *execve_addr;
char *ret;
일단 fp라는 파일 포인터를 생성하는 것이 보인다. 또 여러개의 캐릭터형 포인터를 생성한다.
// gain address of execve
fp = popen("/usr/bin/ldd /home/giant/assassin | /bin/grep libc | /bin/awk '{print $4}'", "r");
fgets(buffer, 255, fp);
sscanf(buffer, "(%x)", &lib_addr);
fclose(fp);
fp = popen("/usr/bin/nm /lib/libc.so.6 | /bin/grep __execve | /bin/awk '{print $1}'", "r");
fgets(buffer, 255, fp);
sscanf(buffer, "%x", &execve_offset);
fclose(fp);
execve_addr = lib_addr + (int)execve_offset;
// end
이 코드는 주석에 써져있는 대로, execve() 함수의 주소값을 구하는 코드이다. 이 코드를 bash 환경에서 실행해보면 대충 어떤 식으로 사용되는지 알 수 있을 것이다.
ldd 명령어로 공유라이브러리의 주소값을 구하고 나서, 그 라이브러리에 있는 execve 함수의 오프셋을 더해 execve 함수의 주소값을 구한다. 설명이 완벽히 되었는지는 모르겠다.
다음 코드를 보자
memcpy(&ret, &(argv[1][44]), 4);
if(ret != execve_addr)
{
printf("You must use execve!\n");
exit(0);
}
이 코드는 ret에 argv[1][44] + argv[1][45] + argv[1][46] + argv[1][47] 을 복사한다. 그리고 ret에 있는 값과 execve_addr에 있는 execve() 함수의 주소값을 비교한다.
그래서 우리는 execve() 함수를 이용해서 overflow 해야한다는 사실을 알 수 있다.
물론 다른 방법들도 있지만, 기존의 방법대로 execve()의 함수를 찾겠다.
이렇게 gdb로 execve함수의 주소가 0x400a9d48 라는 것을 알았다.
지금 학교 자습시간에 작성하고 있는데 분위기가 안좋아서 풀이는 나중에 올리도록 하겠다ㅏ.
'Hacking > Pwn.' 카테고리의 다른 글
Lord of BoF allclear~! (0) | 2017.10.02 |
---|---|
[퍼옴] heap with gdb (0) | 2017.07.07 |
[pwnable.kr] flag write up (0) | 2017.04.29 |
RTL공격을 공부하면서 살짝 정리 (0) | 2017.04.26 |
lob 현황 (0) | 2017.04.25 |