[pwn] cmd_center
또 bof 다. 이제 이 정도 쯤은 식은 죽 먹기지.. 가볍게 왼손만 써서 후딱 풀고 치워버리자. (라고 쓰여있는데요?)
힌트가 적혀있긴 한데.. 무슨 말인지 한 개도 못 알아먹겠다.
코드부터 살펴보자.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
void init() {
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
}
int main()
{
char cmd_ip[256] = "ifconfig";
int dummy;
char center_name[24];
init();
printf("Center name: ");
read(0, center_name, 100);
if( !strncmp(cmd_ip, "ifconfig", 8)) {
system(cmd_ip);
}
else {
printf("Something is wrong!\n");
}
exit(0);
}
strcmp랑 strncmp랑 리턴값이 반대였던 걸로 기억하는데, 지금 찾아봐야 어차피 기억도 못 할거고 찾아보기 귀찮으니 일단 넘어가자. 256바이트나 되는 cmd_ip 변수에는 "ifconfig" 명령어 문자열이 담겨있고, 앞에서부터 8자리를 읽어와 "ifconfig"와 일치할 경우 cmd_ip에 담긴 내용을 쉘에 넘겨버린다. center_name의 크기는 24바이트인데 read를 통해 100바이트나 읽어들이는 것을 보니 백빵(?) 스택에서의 버퍼 오버플로우 문제이다. 그러면 페이로드 작성을 위해 스택 프레임을 계산해보자. center_name이 24바이트, 더미가 8바이트, 그 위에는 cmd_ip가 들어간다. 64비트이므로 int의 크기가 8바이트임에 유의하여야 한다.
가능하면 디버거같은 툴을 안 쓰고 풀고자 하는 주의라서 힘들었다. 플래그 제출하고 혹시 더 배울만한게 있을는지 풀이 란 구경하고 있는데 나처럼 이렇게 생각하는 사람이 딱 한 명 보이더라. gdb같은 디스어셈블러로 가보고 풀었으면 이런 생각은 아예 놓치고 지나갔을게 분명하다. 휴..
https://dreamhack.io/wargame/challenges/117/?writeup_id=3271
cmd_center
Description IP를 확인할 필요가 없습니다! 혹시 다른 명령어는 못쓰나요? 다른 명령어를 사용했다면 플래그를 획득하세요! References https://dreamhack.io/learn/2/1#3 https://dreamhack.io/learn/2/14#3
dreamhack.io
아무튼 32바이트 (0x20) 만큼 의미없는 문자를 담은 뒤에, "ifconfig" 8글자를 담고 그 뒤에는 적당한 값을 넣어 원하는 명령어를 주입(Command Injection Attack)하면 된다.
이 단계에서 엄청 헤맸는데 아무 생각 없이 "0x00"이라고 넣었더니 ㄹㅇ 문자 그대로 "0x00" 문자열이 그대로 들어가는 바람에 한참 죽 쒔다. 뭐 그래도 덕분에 pwntools 모듈에 디버그 모드가 있는 걸 발견했으니 수확은 있었다. 다음부터는 신경 쓰도록 하자.
이번엔 '\0'을 입력해서 정상적으로 널 문자를 담았다. 뒷 부분은 상술했듯이 알아서 적당한 값을 넣으면 되는데, ' ; '를 이용하든 ' && '을 이용하든 모두 동일하게 작동할 것이다.
bash를 정상적으로 불러왔으니 플래그를 읽어오도록 하자. 코멘트에 다들 쉬운 문제라고 난리길래 얕봤는데 디스어셈블리 안 쓰고 풀었더니 나름 배워가는게 생겨서 맛있게 풀었다.
DH{f4c11bf9ea5a1df24175ee4d11da0d16}