01/10/2018, 09:42

Gỡ bomb code Assembly

Chào mọi người, mình đang làm bài toán gỡ 1 quả bomb. Mình tìm trên mạng thì có 1 trang viết bằng tiếng nhật hướng dẫn. Mình dịch sang tiếng anh để đọc nhưng chưa hiểu. Mong diễn đàn giải đáp giúp ạ.


0x401ebe It is stored in “% d% d”, and then reads the sscanf. The first number in 0xc (% rsp), the less than 16, then into% eax, will be used later as an array index and the second on 0x8 (% rsp), and finally to compare and% edx.
Here is the key code:

Where in %edx as counter 12 is equal to the last. mov 0x401ba0(,%rax,4),%eax% Eax as the value of the array index value is stored again it points in% eax,% ecx is calculated while this process and all% eax,% eax up equal to the 15 (cltq instruction is extended from 32 to 64 bit).
Thus the 0x401048 set breakpoint, dump out the entire array.
Get the whole point chain: 15->5->12->3->7->11->13>9->4->8->0->10->1->2->14->6->15so the answer is 7 93.

David Teo viết 11:48 ngày 01/10/2018

Mình hiểu được ý như vầy. Đầu tiên chương trình yêu cầu người dùng nhập vào 2 số a, b với a < và được lưu trong thanh ghi eax. Số thứ 2 lưu ở stack.

rogp10 viết 11:47 ngày 01/10/2018

Cái này giống mấy kiểu file để tập RE

*grab popcorn* viết 11:48 ngày 01/10/2018

Bạn dịch từng dòng ra C là nghiệm ra mà

Mình thử dịch ra như sau:

void explode_bomb() {
	printf("BOOM");
}

int main(void) {
	int _0x401ba0[] = {10, 2, 14, 7, 8, 12, 15, 11, 0, 4, 1, 13, 3, 9, 6, 5};
	uint32_t eax, ecx, edx, a, b;
	uint64_t rax;

	if(scanf("%d %d", &a, &b) > 1) {
		eax = a &= 0xf;
		if(eax != 0xf) {
			ecx = 0;
			edx = 0;
			do {
				edx += 1;
				rax = (uint64_t)eax; //cltq
				eax = _0x401ba0[rax];
				ecx += eax;
			} while (eax != 0xf);
			a = eax;
			if(edx == 0xc && ecx == b) {
				printf("You won!");
				return 0;
			}
		}
		explode_bomb();

	} else {
		explode_bomb();
	}

	return 0;
}

=> Đoán alf chương trình trên là tìm số bắt đầu sao cho đi qua 12 phần tử và tổng ecx == b
=> a = 7, b = 93

À mà, cũng có tí thắc mắc. Nếu ko nhầm thì đây là fastcall calling convension (2 DWORD được mov từ trái sang phải vào RCX, RDX). Vậy [rsp + 0xc] là [b] chứ nhỉ?

viết 11:48 ngày 01/10/2018

bạn học cái gì mà có bài tập này vậy?

David Teo viết 11:50 ngày 01/10/2018

Cảm ơn bạn nhiều. <3

David Teo viết 11:43 ngày 01/10/2018

Môn an ninh mạng bạn.

viết 11:42 ngày 01/10/2018

ô hay nhỉ, cho mình học chung với đc k

David Teo viết 11:58 ngày 01/10/2018

Ủa, là sao ạ. Sao lại thu hồi.

Bài liên quan
0