부제굴능
article thumbnail
Published 2021. 12. 6. 22:04
[HackCTF] strncmp Write-up HackCTF/Reversing

첫 150점짜리 문제를 풀어봅니다.

 

근데 생각보다 엄청 쉬워서 놀랐네요.

 

C언어만 완벽히 하실 줄 아신다면 정말 쉬운문제가 되겠습니다.

 

바로 풀이 해볼게요

 

 

우선 첨부된 바이너리 파일을 IDA로 열어보겠습니다.

 

 

 

열어보신분들은 알겠지만 main 함수의 어셈블리가 상당히 깁니다..

 

배열에 문자열이 들어가는걸 어셈블리로 표현해서 그런 것 같은데요

 

슈도코드로 보면 아주 간결하게 정리가 됩니다.

 

 

이렇게요!

 

해석을 해보면 "OfdlDSA|3tXb32~X3tX@sX`4tXtz" 을 v5 변수에 복사해줍니다.

 

그런다음 사용자의 문자열 입력을 받고, strcmp로 문자열을 비교해서 맞다면 Good game, 틀리면 Always dig deeper (항상 더 깊게 파고들어라..?) 뭐 이런문자열이 출력이 됩니다.

 

실제로 실행을 시켜서 인자값을 올바르게 넣어주면

위와같이 'Good game' 이러곤 종료됩니다.

 

어 그래 gg는 좋은데 flag는 내놔야지...?

 

혼자만의(?) 싸움을 하고있을 때 저기보이는 strcmp 함수가 눈에 띄었습니다.

 

 

*a1 = strcmp 에서 첫 번째 인자값으로 넘겨진 값인데 v4 즉, 사용자가 입력한 문자열 입니다.

 

여기서 조금 시간을 썼습니다.

 

1. v3 변수는 앞에서  (v3+1) ^ '0x17' 을 하는데

 

0x17 = 23 입니다.

 

그리고 v3에는 값을 누적시키는것이 아닌 최신값으로 업데이트 즉, 덮어씌우고 있기때문에 결국엔 i의 최댓값인 21로 계산이 될 것이고

 

c언어 연산 특성상 우측에서 계산된 값이 먼저 계산된 후, 좌측으로 들어가기에 

v3 = (21 + 1) ^ 23;

즉 v3 = 22가 됩니다.

 

근데 이렇게 값을 구해놓으면 뭐하나요 전혀 쓰이질 않는데.

 

여기서 한참을 해멨습니다.

 

슈도코드가 짤린건 아닐까? 해서 key 값을 brute-force 해보기도하고

 

v3와 key가 연관이 있을거야! 해서 또 노가다를 했습니다

 

만... 아무거도 나오질 않았습니다.

 

침착하게 커피한잔 마시고 다시 생각해봤습니다.

 

 

ㅋㅋㅋㅋㅋㅋㅋ

진짜 어이가없는게 함수 하나를 못봤어요 제가..

 

바로 확인해 보겠습니다.

 

어휴.. 그럼 그렇지..

 

여기 떡 하니 나와있었네요.

 

여기서 atoi 함수는 문자열을 정수형으로 변환시켜주는 함수입니다.

int num;
char *numString = "12300";

num = atoi(numString);

printf("%d", num);

>> 12300 (int)

이런식으로 사용가능합니다.

 

다시 check 함수로 돌아와서요, atoi(a2[1]) 이라고 되어있는데 a2는 이상한 문자열이 들어간 변수입니다. 그 변수에 1번째 값을 정수화 시키네요.

 

...근데 이것도 아니었고 그냥 그 다음줄에 나오는 

if ( v3 * (v3 - 14) == -49 )

여기서 v3 값을 계산해주면 7이란 값이 나오게 됩니다.

 

key = v3;

 

이기 때문에 key 값은 7이 됩니다.

 

key 값을 찾았으니 스트링값이랑 xor하는 스크립트를 짜서 출력만 해주면 됩니다.

 

'HackCTF > Reversing' 카테고리의 다른 글

[HackCTF] keygen Write-up  (0) 2021.12.06
[HackCTF] Handray Write-up  (0) 2021.12.06
[HackCTF] Reversing Me Write-up  (0) 2021.12.06
[HackCTF] Welcome_REV Write-UP  (0) 2021.12.06
profile

부제굴능

@magarets

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!