[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:
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
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!
Recent comments