OLD 2018 ~ 2021/BASIC → Hacking
180121_REVERSING(4)_winme
pogn
2018. 1. 23. 15:54
Concept 개념정리 |
index 주의!!
x 는 출력시킬 값이고, y 는 연산 시킬 값이므로 각 인자의 수가 15,14 이기 때문에 for 문 range에서 인덱스를 잘못 주기 쉽다.
연산과 출력을 변수에 따로 따로 저장해놓고 하는 습관을 들이는게 작은 실수나 오류를 줄일 수 있을 것 같다.
-->
Q. 그런데 왜 atomic 이후로는 출력이 안 되었을까? 변수 x 는 쓰레드마다 1씩 증가하는데 어떤 역할을 할까?
Hands-on Practice 실습 |
주어진 문제를 실행 시켜보면 flag가 atomic 까지 나온다.
그러나 해당 함수를 동적분석을 통해 살펴보니,
MSDN 에서 beginthreadex 함수는
3번째 인자 - 쓰레드로 호출할 함수
4번째 인자 - 해당 함수로 넘겨줄 리스트 ( MSDN에서는 포인터를 넘겨주는데 여기선 int를 넘겨준다... 조금 이상하다.)
5번째 인자 - init flag로 스택크기로 설정해둘 경우 스택 크기로 쓰이기도 한다.
각 프로세스에서는 while문으로 어떤 변수와 인자로 넘어온 a1이 같을 때 까지 while문을 돈 다음
아래의 루틴을 진행한다.
그런데 어셈이랑 비교해 보니 line 7 에서 인자(PUSH)로 넘어가는 값을 IDA에서 해석을 못해주고 있어서 어셈블리로 분석을 진행하였다.
- sub_1000 :
y = y-3
printf("%c",y)
--> 'a' (97) 출력
- sub_1050 :
y = y+0x13
printf("%c",y)
--> 't' (출력
..... ( 이하 생략)
이렇게 생성된 쓰래드가 연산하며 출력시키는 y들을 아래와 같이 python 스크립트를 작성하여 출력하였더니
플래그가 출력되었다.
flag : atomicoperatio
Reference 참고문헌 |
- MSDN : beginthreadex