문제

Write-Up
해당 문제에서는 index.html
파일이 주어지는 문제이다. index.html
을 보고 분석한 후 문제에서 의도한 입력값을 입력하면 해결되는 문제이다.
index.html
을 열게 되면 Flag를 입력하는 창이 계속해서 움직이는 것을 확인할 수 있으며, 코드 상에서 움직이는 부분을 제거하였다.


다음으로 main()
함수를 살펴보자. main()
함수 내부에 다음과 같이 _0x4949
, _0x42931
배열 2개가 선언되어 있고 operator
에 총 4개의 연산이 존재한다.
var flag = document[_0x374fd6(0x183)](_0x374fd6(0x182))['value'],
_0x4949 = [0x20, 0x5e, 0x7b, 0xd2, 0x59, 0xb1, 0x34, 0x72, 0x1b, 0x69, 0x61, 0x3c, 0x11, 0x35, 0x65, 0x80, 0x9, 0x9d, 0x9, 0x3d, 0x22, 0x7b, 0x1, 0x9d, 0x59, 0xaa, 0x2, 0x6a, 0x53, 0xa7, 0xb, 0xcd, 0x25, 0xdf, 0x1, 0x9c],
_0x42931 = [0x24, 0x16, 0x1, 0xb1, 0xd, 0x4d, 0x1, 0x13, 0x1c, 0x32, 0x1, 0xc, 0x20, 0x2, 0x1, 0xe1, 0x2d, 0x6c, 0x6, 0x59, 0x11, 0x17, 0x35, 0xfe, 0xa, 0x7a, 0x32, 0xe, 0x13, 0x6f, 0x5, 0xae, 0xc, 0x7a, 0x61, 0xe1],
operator = [(_0x3a6862, _0x4b2b8f) => {
return _0x3a6862 + _0x4b2b8f;
}, (_0xa50264, _0x1fa25c) => {
return _0xa50264 - _0x1fa25c;
}, (_0x3d7732, _0x48e1e0) => {
return _0x3d7732 * _0x48e1e0;
}, (_0x32aa3b, _0x53e3ec) => {
return _0x32aa3b ^ _0x53e3ec;
}],
getchar = String[_0x374fd6(0x178)];
배열 및 연산자를 선언하고 flag 배열(입력 값)과 특정 연산을 거친 배열 2개( _0x4949
, _0x42931
)를 비교하는 것을 알 수 있다.
if (flag[_0x374fd6(0x17c)] != 0x24) {
text2img(_0x374fd6(0x185));
return;
}
for (var i = 0x0; i < flag[_0x374fd6(0x17c)]; i++) {
if (flag[_0x374fd6(0x176)](i) == operator[i % operator[_0x374fd6(0x17c)]](_0x4949[i], _0x42931[i])) {} else {
text2img(_0x374fd6(0x185));
return;
}
}
text2img(flag);
operator[i % operator[_0x374fd6(0x17c)]]
코드에서 % 연산을 하는 것으로 보아 인덱스에 따라 다르게 연산을 할 것이라고 추측하였다.(예시 - 0번째 인덱스는 +, 1번째 인덱스는 -)
추측한 것이 맞는지 확인하기 위해 크롬 개발자 도구를 활용하여 디버깅을 진행하였다.
디버깅을 진행하게 되면 입력된 값 의 길이가 0x24(36)인지 확인한다.(디버깅으로 length 함수 확인)
if (flag[_0x374fd6(0x17c)] != 0x24) {
text2img(_0x374fd6(0x185));
return;
}

입력된 값을 0x24(36)으로 맞춘 후 디버깅을 다시 진행하였다. 이후 연산자가 어떻게 동작하는지 알기 위해서 operator
부분에 BP를 걸고 확인하면 인덱스 값에 따라 +, -, *, ^ 순서대로 연산하는 것을 알 수 있다.


즉, _0x4949
, _0x42931
2개의 배열을 인덱스에 따라 +,-,*,^ 연산을 한 값이 Flag이다.
위의 내용을 바탕으로 작성한 코드는 다음과 같다.
var1 = [0x20, 0x5e, 0x7b, 0xd2, 0x59, 0xb1, 0x34, 0x72, 0x1b, 0x69, 0x61, 0x3c, 0x11, 0x35, 0x65, 0x80,
0x9, 0x9d, 0x9, 0x3d, 0x22, 0x7b, 0x1, 0x9d, 0x59, 0xaa, 0x2, 0x6a, 0x53, 0xa7, 0xb, 0xcd, 0x25, 0xdf, 0x1, 0x9c]
var2 = [0x24, 0x16, 0x1, 0xb1, 0xd, 0x4d, 0x1, 0x13, 0x1c, 0x32, 0x1, 0xc, 0x20, 0x2, 0x1, 0xe1, 0x2d, 0x6c, 0x6, 0x59,
0x11, 0x17, 0x35, 0xfe, 0xa, 0x7a, 0x32, 0xe, 0x13, 0x6f, 0x5, 0xae, 0xc, 0x7a, 0x61, 0xe1]
var3 = []
for i in range(len(var1)):
if(i % 4 == 0):
var3.append(var1[i] + var2[i])
elif(i % 4 == 1):
var3.append(var1[i] - var2[i])
elif(i % 4 == 2):
var3.append(var1[i] * var2[i])
else:
var3.append(var1[i] ^ var2[i])
print(chr(var3[i]), end = '')
Flag
DH{cfd4a77a013ea616d3d5cc0ddf87c1ea}
오류, 잘못된 점 또는 궁금한 점이 있으시다면 댓글 남겨주세요❗
Uploaded by N2T
'Dreamhack > Web hacking' 카테고리의 다른 글
session-basic Write-Up (0) | 2023.01.17 |
---|---|
Background: Cookie & Session (0) | 2023.01.17 |
[Web hacking] Carve Party Write-up (0) | 2023.01.14 |
Tools:Browser DevTools (0) | 2023.01.13 |
Background:Web Browser🌐 (0) | 2023.01.12 |