-
-
[原创]2019看雪CTF 晋级赛Q2 第4题-丛林的秘密
-
发表于:
2019-6-25 09:21
7011
-
[原创]2019看雪CTF 晋级赛Q2 第4题-丛林的秘密
protected void onCreate(Bundle arg3) {
class implements View$OnClickListener {
(MainActivity arg1) {
MainActivity.this = arg1;
super();
}
public void onClick(View arg2) {
if(gogogoJNI.check_key(MainActivity.this.eText1.getText().toString()) == 1) {
MainActivity.this.txView1.setText("Congratulations!");
}
else {
MainActivity.this.txView1.setText("Not Correct!");
}
}
}
super.onCreate(arg3);
this.setContentView(2131296284);
this.eText1 = this.findViewById(2131165238);
this.txView1 = this.findViewById(2131165322);
this.findViewById(2131165318).loadUrl(this.u);
this.findViewById(2131165318).getSettings().setJavaScriptEnabled(true);
this.button1 = this.findViewById(2131165218);
this.button1.setOnClickListener(new (this));
}
}
onCreate处理中中有个loadUrl(),url地址如下:
protected void onCreate(Bundle arg3) {
class implements View$OnClickListener {
(MainActivity arg1) {
MainActivity.this = arg1;
super();
}
public void onClick(View arg2) {
if(gogogoJNI.check_key(MainActivity.this.eText1.getText().toString()) == 1) {
MainActivity.this.txView1.setText("Congratulations!");
}
else {
MainActivity.this.txView1.setText("Not Correct!");
}
}
}
super.onCreate(arg3);
this.setContentView(2131296284);
this.eText1 = this.findViewById(2131165238);
this.txView1 = this.findViewById(2131165322);
this.findViewById(2131165318).loadUrl(this.u);
this.findViewById(2131165318).getSettings().setJavaScriptEnabled(true);
this.button1 = this.findViewById(2131165218);
this.button1.setOnClickListener(new (this));
}
}
onCreate处理中中有个loadUrl(),url地址如下:
int __fastcall Java_com_example_assemgogogo_gogogoJNI_sayHello(int a1)
{
int v1; // r11
int v2; // r4
int i; // r0
int v5; // [sp+0h] [bp-98h]
char v6; // [sp+15h] [bp-83h]
int v7; // [sp+88h] [bp-10h]
v7 = v1;
v2 = a1;
_aeabi_memclr8(&v5, 128);
for ( i = 0; i != 21; ++i )
*((_BYTE *)&v5 + i) = byte_2D28[i] ^ 0x66;
v6 = 0;
return (*(int (__fastcall **)(int, int *))(*(_DWORD *)v2 + 668))(v2, &v5);
}
在JNI_OnLoad中的inti_proc()有socket操作,在函数开始有一段解密操作。
int __fastcall Java_com_example_assemgogogo_gogogoJNI_sayHello(int a1)
{
int v1; // r11
int v2; // r4
int i; // r0
int v5; // [sp+0h] [bp-98h]
char v6; // [sp+15h] [bp-83h]
int v7; // [sp+88h] [bp-10h]
v7 = v1;
v2 = a1;
_aeabi_memclr8(&v5, 128);
for ( i = 0; i != 21; ++i )
*((_BYTE *)&v5 + i) = byte_2D28[i] ^ 0x66;
v6 = 0;
return (*(int (__fastcall **)(int, int *))(*(_DWORD *)v2 + 668))(v2, &v5);
}
在JNI_OnLoad中的inti_proc()有socket操作,在函数开始有一段解密操作。
v0 = &mm0;
v1 = 34291;
v9 = 1;
while ( v1 )
{
--v1;
*v0 ^= 0x67u;
++v0;
}
还原这段数据我们可以得到对应的html
v0 = &mm0;
v1 = 34291;
v9 = 1;
while ( v1 )
{
--v1;
*v0 ^= 0x67u;
++v0;
}
还原这段数据我们可以得到对应的html
`.trim().split(/[\s\r\n]+/g).map(str => parseInt(str, 16))
)).then(module => {
new WebAssembly.instantiate(module).then(results => {
instance = results;
}).catch(console.error);})
function check_flag(){
var value = document.getElementById("key_value").value;
if(value.length != 32)
{
document.getElementById("tips").innerHTML = "Not Correct!";
return;
}
instance.exports.set_input_flag_len(value.length);
for(var ii=0;ii<value.length;ii++){
instance.exports.set_input_flag(value[ii].charCodeAt(),ii);
}
var ret = instance.exports.check_key();
if (ret == 1){
document.getElementById("tips").innerHTML = "Congratulations!"
}
else{
document.getElementById("tips").innerHTML = "Not Correct!"
}
}
这是一道关于
WebAssembly的题。
`.trim().split(/[\s\r\n]+/g).map(str => parseInt(str, 16))
)).then(module => {
new WebAssembly.instantiate(module).then(results => {
instance = results;
}).catch(console.error);})
function check_flag(){
var value = document.getElementById("key_value").value;
if(value.length != 32)
{
document.getElementById("tips").innerHTML = "Not Correct!";
return;
}
instance.exports.set_input_flag_len(value.length);
for(var ii=0;ii<value.length;ii++){
instance.exports.set_input_flag(value[ii].charCodeAt(),ii);
}
var ret = instance.exports.check_key();
if (ret == 1){
document.getElementById("tips").innerHTML = "Congratulations!"
}
else{
document.getElementById("tips").innerHTML = "Not Correct!"
}
}
这是一道关于
WebAssembly的题。
使用wasm2c反编译成c(wasm),这个C比较难看,使用gcc重新编译生成.o后,再使用IDA分析,舒服多了。
check_key()函数如下:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)