WARGAME/pwnable.kr [system] (6) 썸네일형 리스트형 [Toddler's Bottle] 6번 random 언제나처럼 cat random.c를 해본다. key 를 입력받고 rand() 와 xor시킨 값을 0xdeadbeef 와 비교해서 같으면 플래그를 획득할 수 있다. rand()가 랜덤으로 난수를 생성하는데 어떻게 풀어야하는걸까 정말 2^32 번 반복해야하는걸까 ? rand() 그대로 사용하면 랜덤 값이 아닌 같은 값을 출력한다는 취약점이 있다. 따라서 실행시 마다 바뀌는 난수를 얻고 싶다면 srand(time(NULL)) 을 사용해야한다. *rand() : 예측할 수 없는 하나의 난수를 생성, 범위는0~RAND_MAX(0x7fff) ,따라서 난수의 범위는0~32767 *srand() : 호출할때 전달받은 인자를 기반으로 난수를 초기화 *time() : 인자로 NULL을 넘기면1970년1월1일(UTC 타임 .. [Toddler's Bottle] 9번 mistake 9번은 연산자 우선순위가 힌트라는 걸 알아두고 실행해보았다. ls 로 mistake.c 가 있는 것 확인 후 열어보면 가장 먼저 system(“/bin/cat flag\n”) 가 있는 곳에서 조건을 확인해보면, pw_buf와 pw_buf2 를 비교해서 값이 같으면 플래그를 획득할 수 있는 것 같다. 그러나 pw_buf2 의 값을 1과 xor 연산하기 때문에 pw_buf2 를 1과 xor 연산한 후의 값과 pw_buf 값을 비교한다. -> 1 xor (pw_buf2) 와 pw_buf 비교 바로 위를 보면 pw_buf2 는 scanf 를 통해 10바이트까지 입력받을 수 있는 것 같고, pw_buf는 if(!(len=read(fd,pw_buf,PW_LEN) > 0)) 에서 처리되는데, 앞선 풀이에서 정리했듯이.. [Toddler's Bottle] 4번 flag ls 로 flag 하나 있는 것 확인 후 cat, 난독화가 되어 있고, UPX 라는 문자열을 통해 UPX 패커로 패킹되어 있음을 알 수 있었다. 따라서 언패킹 후 다시 확인해보기로 했다. upx -d 명령어로 언패킹 후 다시 cat, 우선 스트링이 잘 보이는 것을 보아 언패킹이 잘 되었음을 확인 후 실행 시켜보기로 했다. 권한 부여 후 실행, malloc()후 flag와 strcpy 한다는 문구가 출력된다. 따라서 디버깅을 해보았다. #0x6c2070 가 눈에 띈다. 그래서 해당 주소 메모리를 확인해봤다. 해당 주소가 0x00496628에 있음을 확인한 후, x/x로 출력해봤는데 헥사로 나오는걸 보고 string 으로 다시 출력해보았다. flag 획득 + 참고 + 구글링을 해보니까 IDA 를 사용하면 디.. [Toddler's Bottle] 3번 bof 그냥 접속 시 Nah 출력되는 것을 확인하고 파일 다운로드 후 cat bof.c 으로 소스 먼저 확인해봤다. 32바이트 배열에 문자열을 입력 받고 ‘0xdeadbeef’와 ‘0xcafebabe’가 같으면 쉘을 획득할 수 있는 것 같다. 이때 gets() 를 사용해서 입력 버퍼 크기를 넘어서서 문자열을 입력 받을 수 있게 하는 것을 보아 bof 시켜 해결하는 문제임을 예측할 수 있었다. 따라서 bof 에 실행 권한 부여 후 gdb로 배열과 key 사이가 몇 바이트인지 확인해보기로 했다. main 0xdeadbeef 넣는 것 확인, func 까지 보고, 문제 해결 방법에는 크게 2가지가 있을 것 같다고 생각했다. 방법1. gdb 만 보고 스택 그린 후 오버플로우 시킬 바이트 판단하기 * lea : 주소 불러.. [Toddler's Bottle] 2번 collision 2번 문제를 풀어보자. 1번 fd 와 마찬가지로 ls하면 col.c 파일이 보인다. col.c 를 확인해본다. 살펴보면 hashcode인 0x21DD09EC 와 길이가 20byte인 입력 인자가 같으면 flag 가 출력될 것으로 보인다. check_password 함수를 살펴보면 char포인터를 int 포인터로 변환, for 문은 5번 반복 (4바이트씩 끊어 res에 추가)하는 것을 볼 수 있다. 따라서 계산기를 이용해 계산해보면 0x21DD09EC / 5 = 0x6c5cec8 , 나머지 확인을 위해 다시*5 하면 0x21DD09E8로, 0x4 부족 -> 마지막에 +4 필요 *주의: char형 이int형으로 변환될 때에는 리틀 엔디언 형식으로 변환 6c5cec8 * 4 + 6c5cecc -> \xc8\x.. [Toddler's Bottle] 1번 fd putty로 로그인해도 좋고 칼리로 해도 좋지만 나는 칼리를 사용했다. 로그인 후 ls 로 파일을 확인하는데 우선 c 파일이 보여서 확인해보기로 했다. fd.c 먼저 cat *atoi :문자열-> int fd = int(첫번째 인자) - 0x1234 이후 read 함수의 첫번째 인자로 fd가 들어가는데 문제 이름이 fd 인 만큼 fd 를 이용해야한다는 것을 알 수 있다. *fd = 0 : 표준 입력 *fd = 1 : 표준 출력 *fd = 2 : 표준 에러출력 따라서 fd에 따라 buf 에 저장되는 것으로 볼 수 있다. 이 buf 에 저장된 값과 ”LETMEWIN”이 같으면 flag 획득할 수 있다는 것 같다. 우선 0x1234 = 4660 이므로 ./fd 실행 시 인자로4660 함께 입력하면, 표준 입력.. 이전 1 다음