CTF/리버싱

[angstromCTF] Inputter - 리버싱 / argument

SecurityMan 2022. 3. 21. 15:30

리버싱 문제인 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를 같이 넣어서 실행시켜주면

 

문제가 풀리게 된다.

(캡쳐에는 플래그 파일이 없어서 없다고 에러가 났다.)

반응형