Pwn là gì

This is my write-up for recent hack you spb CTF – a CTF for newbies. I guess I”m a bit older here ahaha.

Bạn đang xem: Pwn là gì

Đang xem: Pwn là gì

Continue reading hackyou.ctf.su 2016 →

*

Líp vẫn nhớ và yêu Híp nhiều lắm …

Chiến đấu bên những người anh em luôn làm tôi cảm thấy thoải mái và phấn khích. Đợt contest này cả đội đã có 1 ngày không ngủ, cũng gần như không ăn, chỉ dùng lon bò húc để cầm hơi. Cả đội đã rất nỗ lực và hy vọng tràn trề khi lúc đầu liên tục tranh giành top 1 với kỳ phùng địch thủ. Cho đến giữa đêm, do thiếu một chút may mắn ( tôi thì không nghĩ vậy, đêm là khoảng thời gian tôi hay rơi vào trạng thái không ổn định

*

) mà mọi người mất dần ý chí chiến đấu, nhìn đội khác vươn lên. Có lẽ nếu như tôi dành được 400 điểm từ bài này thì mọi chuyện đã khác. Nhưng dù sao “có lẽ” vẫn chỉ là 1 từ người ta dùng để biện hộ cho lỗi lầm của mình mà thôi.Continue reading Whitehat Contest 12 – Pwn400 →

View all 2 comments Unlink techniqueApril 7, 2016pwnheaphardtobelieve

Đây là một trong những kỹ thuật cơ bản dùng để khai thác lỗ hổng ở vùng nhớ heap

Cấu trúc heap

Glibc tổ chức 1 heap chunk như sau:

struct malloc_chunk { INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */ INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */ struct malloc_chunk* fd; /* double links — used only if free. */ struct malloc_chunk* bk; /* Only used for large blocks: pointer to next larger size. */ struct malloc_chunk* fd_nextsize; /* double links — used only if free. */ struct malloc_chunk* bk_nextsize;}; Continue reading Unlink technique →

Leave a comment DEFCON CTF 2015 – wwtv , cybergrandsandboxMay 18, 2015pwnpeternguyen WWTV

The bug is easy to find at function Coordidate, this is basic format string bug

time_c > 0x55592B6C && time_c We must set time_c in range (0x55592b6c,0x55592b7f>.

Take a look at READ_DATA function , will be triggered after 2 second.

Take a look at function handle_digit 

Nhận path request , tiến hành urldecode rồi open cái file html/js/… mà client yêu cầu, sau đó trả về content.

Xem thêm: Cách Xem Ram Máy Tính Win 7, Win 10 Đơn Giản, Cách Kiểm Tra Cấu Hình Máy Tính Win 7 Đơn Giản

Kiểm tra hàm CleanURL

Hàm có tác vụ urldecode, tuy nhiền hàm này lại không filter “../” (path traveler) cho phép attacker có thể sử dụng “../” để read /etc/passwd (hoặc flag) chẳng hạn

*

Ok easy roài, extract data python ra thôi – Link

import sysif len(sys.argv) == 13:print “Great: flag{g3771ng_st4rt3d_2015}”else:print “.”——————————————————————————————————-

RE 200 – upx.exe

string thử chả thấy cái UPX! signature nào . decompress lại cho chắc failed nốt.

*

Run

*

OK boy let”s make it nicely!

Bật IDA Disass thấy đây là 1 binary MS C++ bình thường.

main là winMain -> sau đó call hàm sub_4001000

int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd){ sub_401000(); return 0;}void *__cdecl sub_401000(){ void *result; // void *MZ_header; // int v2; // int v3; // int v4; // int v5; // const char *v6; // unsigned int v7; // int v8; // HANDLE v9; // void *v10; // unsigned int v11; // HANDLE v12; // int v13; // SIZE_T v14; // 14 result = GetModuleHandleW(0); MZ_header = result; v14 = (SIZE_T)result; if ( result ) { result = (void *)”ZM”; if ( *(_WORD *)MZ_header == “ZM” ) { result = (char *)MZ_header + *((_DWORD *)MZ_header + 15); if ( *(_DWORD *)result == “EP” ) { v2 = *((_WORD *)result + 10); v3 = *((_WORD *)result + 3); v4 = 0; v5 = (int)((char *)result + v2 + 24); if ( v3 > 0 ) { v6 = (char *)result + v2 + 24; while ( 1 ) { result = (void *)strcmp(v6, “.reloc”); if ( !result ) break; ++v4; v6 += 40; if ( v4 >= v3 ) return result; } v7 = *(_DWORD *)(v5 + 40 * v4 + 16); v8 = v5 + 40 * v4; v9 = GetProcessHeap(); result = HeapAlloc(v9, 8u, v7 + 1); v10 = result; if ( result ) { // malloc, copy hex sang cho malloc 6600 unknown_libname_41(result, v14 + *(_DWORD *)(v8 + 12), *(_DWORD *)(v8 + 16)); v11 = 0; if ( v7 ) { do *((_BYTE *)v10 + v11++) ^= 0x11u; while ( v11 đầu tiên nó gọi hàm getModuleHandle để tìm base address của MZ Headersau đó check MZ signature và PE signature ::for sure::

Xem thêm:  Phần Mềm Chụp Sửa Ảnh Đẹp Cho Android

*

find session .alloc

*
*

var A = heapalloc(0x6600)đến đoạn unknown_libname_41 này vì mình rất ghét cái gì cứ dấu giếm, và 1 phần nhác trỗi dậy. function thông thường của mscrt thôi nên xem các tham số truyền vô và kết quả trả về để đoán vậy (memcpy)

memcpy(0x41b00, A, 0x6600)for i in range(0x6600):A ^= 0x11*một đoạn memory khá dài, lại còn bị mã hóa nữa. không thể nào là flag cipher được? Có lẽ nào là shellcode?

new_size = *(dword*)A = 0xbe00var B = heapalloc(new_size)sub_406660( &new_size ) => copy MZ_Header -> đến B, size = 0xbe00

*

Từ đây ta nhảy vào sub func cuối là sub_401b60

Check các sub phụ, để ý các string mình thấy rất là liên quan

Mapping PE file Creating Map View of File Map View of File created Checking for self relocation MyBase, MySize ?!? Jumping to relocated image Processing IAT Loading Library and processing Fixing Image Base address in PEB Executing Entry Point !!!và 1 số function khá vãi

– CreateFileMappingW- MapViewOfFile- VirtualAlloc- GetProcAddress- VirtualQuery- LoadLibraryA- VirtualProtectoke, tít đi ít! run shellcode chắc roài ::bem::

ta đặt breakpoint ở ngay các sub con và run lần lượt đến khi nào shell được chạy thì phát hiện điểm G

*

sub_401b60 -> sub_401600 -> call eaxnew entry point = 08001563sài HxD (hex editor) view ram process upx.exe tại địa chỉ đó thì thấy nguyên session từ 0x08000000 -> 0x0800FFFF là 1 file PE mới,

search string thì thấy có dòng “You didn”t ask nicely” và đặc biệt là “-pl34se-give-me-th3-k3y” :-ss

tới đây các bạn có thể extract ra 1 file exe mới và disass nghiên cứu (ko chắc là sẽ chạy đc ok), còn mình thì thấy nó có dạng 1 file ms c++ nữa nên so sánh structure với cái PE gốc để tìm addr winMain

địa chỉ 0x08001100quá trình dịch cũng tương tự, bài mới này cũng không quá khó.

Xem thêm: Top 300 Mẫu Nhà Cấp 4 Có Gác Xép, 35 Mẫu Nhà Cấp 4 Có Gác Lửng Siêu Đẹp

st = command_line_stringst = x00if st==x20:if !strcmp(st, “-pl34se-give-me-th3-k3y”):func_flag()exit()msgbox(“You not nicely”);patch luôn cho lẹ, patch luôn chỗ strcmp và trong func_flag (0x08001000) có 1 chỗ gọi isDebuggerPresent (0x08001024)

Xem thêm:  Hướng dẫn cài đặt game thùng mới: game máy, game bộ đội 2, game bộ đội đi cảnh

*

*

Done.

———————————————————————————-

RE 400 – fin64

:/media/sf_Desktop/nullcon/re/fin64$ file fin64fin64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.24, BuildID=0x9b62a9678a30ce6c576131024148154a0bc5575d, strippedkhi chạy và thử nhiều cách input, đều có kết quả “Not yet..”

:/media/sf_Desktop/nullcon/re/fin64$ ./fin64Not yet..main khá ngắn, ta dịch lần lượtđể ý, có 2 cái good_boy và bad_boy trong hình

*

đầu tiên là func_systimegọi syscall 0xc9 để lấy timestamp sao đó lưu giá trị vào

*

func_ctime – convert timestamp thành giá trị giây:phút:giờ:ngày:tháng:năm => lưu vào

*

dừng ở đây, jump ngược từ good_boy và bad_boy ta thấy có đoạn sử dụng

*

nếu ở không bị thay đổi thì đoạn code pseudo ntn:

giờ ta jump back từ đoạn compare trên đến ngay sau chỗ convert, patch những đoạn jump để bypass khoảng ở giữa và chạy lại 1 lần nữa

$ ./fin64Oops..Good bj, mình đoán flag nằm trong memory, thử trace dần vào good_boy

thì phát hiện ra cái này *byte_6c2070

*

next-challenge

————————————————————————————–

RE 500 – cso

bài này thực sự không biết nên viết writeup như thế nào vì công nhận là nó khá bựa và cách làm cũng ngẫu hứng vãi nhái :3

sau hồi dịch mình chả biết nó là cái giống gì, có vẻ giống virtual machine nhưng cũng ko giống lắm =)), đại khái nó như này:

main:print(Bla bla bla)gets(st) #main inputlen_st = strlen(st)super = 0x24ae5af1 #first magic hexwhile True:A: if super-a1>0: jump b1B: if super-a2>0: jump b2C: if super-a3>0: jump b3…V: if super-an>0: jump bnX:super = a(n+1)Y:super = a(n+2)…Z:super = amquit:breakdead: puts(“You are dead man”)super = super_to_quitcontinuewin: puts(“You are safe and live forever”)super = super_to_quitcontinuecheck_len: if len_st==0x1A: super = super_to_stage2else:super = super_to_deadcontinuestage_2:#func_stage2 ở địa chỉ 0x00400ec0if func_stage2(st)==1: super = super_to_winelse:super=super_to_deadcontinue#mấy số a1, a2, …an, a(n+1), … , am là magic const, ko biết có quy luật gì những mà nó đc build để tính toán hợp lí#các jump b1, b2, b3, … bn là nhãn của một trong mấy thằng A,B,C,…V, quit, dead, win, check_len, stage_2def stage2(st):#cấu trúc đệ quy#vòng lặp tương tự main#có thêm 1 số sub function phụKhông biết flag ở chỗ nào luôn, code follow control dựa vào mấy phép cộng của a(i), giờ tìm quy luật cho nó cũng đuối đơ. Có duy nhất 1 cái chắc chắn là len_st = 0x1A = 26 (!!!)

Sau nửa tiếng suy nghĩ, mình thấy khi input với len = 26 và len Bingo, chuẩn girl mất rồi, side channel bem lần lượt các char

import subprocessimport timesam = “abcdefghijklmnopqrstuvwxyz”sam += sam.upper()sam += “0123456789_!,.{}”#217826 SRRDRSSRSRRDDSSSRSSDSDDDSSdef insco(fl):fl += “a”*(26-len(fl))open(“hellyeah”,”wt”).write(fl)subprocess.call(“./pin -t source/tools/ManualExamples/obj-intel64/inscount0.so — ../cso 400: dequy(fl + c)dequy(“”)=> Final SRRDRSSRSRRDDSSSRSSDSDDDSS. Không giống flag cho lắm :-ss

Input test lại vẫn “You are dead man”. Wut dafuq, đúng quá rồi còn gì.Check lại cái inscount thì thấy có sự chênh lệch rất lớn ins.Có thể là những mini-sub trong stage2 (0x00400ec0)Kiểm tra lần lượt từng mini-sub đó ta thấy có sub_400BD0 sử dụng biến global(s) chính là string input ban đầu?!?

*

Đặt breakpoint ngay tại đó và input đúng như trên, sau 1 số lần trace thì …

*

Âu Mai Gót, call cái địa chỉ vừa trả về, không phải run shell thì là run cái gì nữa =))
Chuyên mục: Công Nghệ

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *