[CSAW CTF 2013] keygenme (Re400)

keygenme – 400 Points

Solved by 100 teams.

nc 128.238.66.219 14549
keygenme32.elf

File dự phòng:

Nội dung chính

Đây là note thì đúng hơn là một writeup

Ở bài này chúng ta được yêu cầu nhập 3 tham số: username token1 token2. Trong đó từ username target sẽ tính ra 2 giá trị rồi thực hiện so sánh với token1 và token2. Cũng lưu ý rằng trước khi so sánh thì token1 và token2 sẽ được đụng chạm một chút, tuy nhiên nó khá đơn giản nên vấn đề sẽ chỉ là hiểu được quá trình xử lý username mà thôi.

Thật đáng tiếc, phần quan trọng nhất lại cũng chính là phần khó chịu nhất, khi mà lực lượng team mỏng, thời gian thì hạn chế, nên sau vài giây phút cố gắng đọc hiểu (để chứng tỏ rằng ta đây cũng thuộc hàng cứng), kết quả trả về gần như là null. Chuyển hướng, với mục tiêu là có được kết quả xử lý từ app thay vì tự code:

  • Một thằng tìm cách patch emo_popo_sure
  • Thằng còn lại tìm cách khác emo_popo_shame

Thành công khá muộn của bài này ghi đậm dấu ấn sắc nét mang đầy tính hổ báo cáo mèo của 2 con cú đêm đang hừng hực khí thế leo top. Chiến lược được vạch ra và triển khai nhanh chóng, đó là… sử dụng gdb làm trung gian. Hết, đơn giản vậy thôi emo_popo_pudency

Diễn giải ra thì: Connect đến server, nhận username > Chạy bằng gdb > đặt BP > Run > Đọc giá trị thanh ghi > Xác định token1, token2 > Đưa lên server > Lặp vài lần > Nhận flag.

Code minh họa:
[python]import subprocess
import socket

HOST = ‘128.238.66.219’
PORT = 14549

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.recv(1024)

try:
while (True):
text = s.recv(1024) # give me the password for

name = text.split(‘give me the password for ‘)[1].split(‘n’)[0]
print ‘name:’, name

command = ‘gdb –command=script –args keygenme32.elf %s 123 456’ % name
output = subprocess.Popen(command, shell=True, stdout= subprocess.PIPE).stdout.read()

register_info = output.split(‘Breakpoint 1, 0x0804a110 in main ()’)[1]
eax = output.split(‘eax’)[1].split(‘0x’)[1].split(‘t’)[0]
edx = output.split(‘edx’)[1].split(‘0x’)[1].split(‘t’)[0]
print ‘eax:’, eax, ‘, edx:’, edx

eax = int(eax, 16)
edx = int(edx, 16)
token1 = eax ^ 0x31333337
token2 = ((edx & 0xFF000000) >> 8) | ((edx & 0x00FF0000) >> 8) | ((edx & 0x0000FF00) << 16) | ((edx & 0x000000FF)) print 'token1: %s, token2: %s' % (hex(token1), hex(token2)) password = '%s %sn' % (token1, token2) print 'password:', password s.send(password) print s.recv(1024) except: # done, get flag print s.recv(1024) print s.recv(1024) [/python] File script cho gdb: [sh]break *(0x0804a110) run info register quit[/sh] Kết quả: [sh]ycs@ycs:~/Desktop$ python re400.py give me the password for 60569109cfe7e81cf00df6e32c2f34fe name: 60569109cfe7e81cf00df6e32c2f34fe eax: ea78acf4 ; edx: 7aafc05f token1: 0xdb4b9fc3, token2: 0xc07aaf5f password: 3679166403 3229265759 :-) give me the password for 3dead73a5da19bec7e93bb522a6f5039 name: 3dead73a5da19bec7e93bb522a6f5039 eax: dd921061 ; edx: 1438b085 token1: 0xeca12356, token2: 0xb0143885 password: 3969983318 2954115205 :-) give me the password for 5d0369aee99fd7a8dd3876e66534d381 name: 5d0369aee99fd7a8dd3876e66534d381 eax: db071f7b ; edx: 395aa8ca token1: 0xea342c4c, token2: 0xa8395aca password: 3929287756 2822331082 :-) give me the password for 829b14b1aa28d27bef59bffcb1f36649 name: 829b14b1aa28d27bef59bffcb1f36649 eax: ab5ff942 ; edx: b0f9c645 token1: 0x9a6cca75, token2: 0xc6b0f945 password: 2590820981 3333486917 :-) give me the password for ff6a3b2b4080a60e4ea5b43b1b3f39ce name: ff6a3b2b4080a60e4ea5b43b1b3f39ce eax: 97d26a34 ; edx: e6f9a1e5 token1: 0xa6e15903, token2: 0xa1e6f9e5 password: 2799786243 2716269029 :-) give me the password for b59c61769d1e6d85988527b143c8dc2b name: b59c61769d1e6d85988527b143c8dc2b eax: e38f29cd ; edx: cfe7b577 token1: 0xd2bc1afa, token2: 0xb5cfe777 password: 3535543034 3050301303 :-) give me the password for f9009397403721bfacb24396382f8142 name: f9009397403721bfacb24396382f8142 eax: 8abc2f10 ; edx: 27480314 token1: 0xbb8f1c27, token2: 0x3274814 password: 3146718247 52906004 :-) give me the password for 9a6ba93fbce55234c96af98f7b1fddaa name: 9a6ba93fbce55234c96af98f7b1fddaa eax: b377c267 ; edx: e3f7017f token1: 0x8244f150, token2: 0x1e3f77f password: 2185556304 31717247 :-) give me the password for 71241d30d3570928c697cfe284e96713 name: 71241d30d3570928c697cfe284e96713 eax: 8fc147ce ; edx: 264743c2 token1: 0xbef274f9, token2: 0x432647c2 password: 3203560697 1126582210 :-) give me the password for 169852d2a74035c633f3c0f172dd0196 name: 169852d2a74035c633f3c0f172dd0196 eax: facdda26 ; edx: 24167bff token1: 0xcbfee911, token2: 0x7b2416ff password: 3422480657 2065962751 :-) here's the flag key{r3vers1ng_emul4t3d_cpuz_a1n7_h4rd!}[/sh] flag = r3vers1ng_emul4t3d_cpuz_a1n7_h4rd!

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *