리버싱 문제인 Inputter
이 문제 역시 대회가 끝나고 풀어서 캡쳐를 제대로 못했다ㅜ
이전에 풀이했던 Revving Up, Taking Off 문제와 동일한 유형(조금 심화한)이다.
Revving Up : https://hackingstudypad.tistory.com/33
Taking Off : https://hackingstudypad.tistory.com/34
이번 문제도 역시나 리눅스에서 실행가능한 바이너리 파일(inputter)가 주어진다.
이 문제는 앞의 문제와 다르게 소스코드도 같이 주어진다.
main 함수를 살펴보면 안에 조건문(if) 세개가 있고, 조건문을 다 통과해야 마지막에
print_flag() 함수가 실행되어 플래그를 얻을 수 있다는걸 알 수 있다.
첫번째 조건문부터 살펴보자
if (argc != 2)
argc는 '2' 값이 되어야한다.
Taking Off 문제에서 언급했던것처럼 argc 는 argument의 갯수를 의미한다.
./inputter hello world 라고 터미널창에 입력했을때,
argv[0] = inputter
argv[1] = hello
argv[2] = world
이런식으로 argument가 argv 배열에 순서대로 들어가고
이 배열의 길이인 3이 argc에 저장된다.
이 문제의 경우 argc가 2여야하니 argument를 하나만 줘야한다는 것을 알 수 있다.
if (strcmp(argv[1], " \n'\"\x07"))
다음 조건문이 조금 난해하다.
strcmp 로 argv[1]에 있는 내용이 " \n'\"\x07" 인지 확인하고 있다.
즉 argument로 " \n'\"\x07" 라는 값을 입력해야 하는데 그냥 키보드 문자 그대로 치면 안된다.
아스키코드표에서 이 부분과 argument 로 넣어야 할 값을 잘 비교해서 해당하는 hex 값을 넣으면 된다.
맨앞에 공백(space)는 아스키코드로 \x20이다.
그다음 \n 은 코드표에서 LF라고 적혀있는데
이것은 LineFeed의 약자로 쉽게 생각하면 그냥 엔터를 의미한다. \n 은 \x0a 로 표현된다.
다음 ' 과 " 는 \x27, \x22로 표현되는것을 확인할 수 있다.
정리하자면 이렇게 argument를 주면 된다. 각 색깔별로 매칭시켰다.
" 앞에있는 \는 이스케이프 문자로 " 를 문자열로 처리하기위한 작업이기 때문에
따로 해석하지 않아도 된다.
if (strcmp(buf, "\x00\x01\x02\x03\n"))
마지막 조건문은 프로그램 실행시 buf에 사용자 입력값을 저장하는데,
그 buf에 저장되는 값이 "\x00\x01\x02\x03\n" 이어야 한다는 것이다.
이건 어려울것 없다. 그대로 넣어주기만 하면 된다.
결론적으로 이렇게 넣어주면 된다.
$ printf '\x00\x01\x02\x03\n' 으로 buf에 들어갈 값을 만들어주고,
| 를 통해 프로그램에 전달한다.
그러면서 프로그램을 실행시킬때
./inputter $'\x20\x0a\x27\x22\x07' 과 같이 argument를 같이 넣어서 실행시켜주면
문제가 풀리게 된다.
(캡쳐에는 플래그 파일이 없어서 없다고 에러가 났다.)
'CTF > 리버싱' 카테고리의 다른 글
[AUCTF] Cracker Barrel - 리버싱 / IDA (60) | 2022.04.02 |
---|---|
[RiftCTF] Reversing 0x0002 - 리버싱 / IDA (38) | 2022.03.30 |
[angstromCTF] Taking Off - 리버싱 / IDA (46) | 2022.03.15 |
[angstromCTF] Revving Up - 리버싱 / argument (43) | 2022.03.14 |
[angstromCTF] Windows of Opportunity - 리버싱 / IDA (38) | 2022.03.13 |