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 năm nhâm thìn →

*

Líp vẫn lưu giữ và yêu Híp các lắm …

Chiến đấu mặt những người dân bạn bè luôn luôn có tác dụng tôi Cảm Xúc dễ chịu và thoải mái cùng phấn khích. Đợt conchạy thử này cả team đang có một ngày không ngủ, cũng gần như là ko ăn, chỉ sử dụng lon bò húc nhằm vắt hơi. Cả đội vẫn khôn cùng cố gắng nỗ lực và mong muốn chan chứa lúc thuở đầu tiếp tục tranh giành top 1 cùng với kỳ phùng địch thủ. Cho cho thân đêm, bởi vì thiếu thốn một chút ít suôn sẻ ( tôi thì không cho là vậy, đêm là khoảng thời gian tôi xuất xắc rơi vào tình thế tinh thần tạm bợ

*

) mà lại đều bạn mất dần dần ý chí pk, nhìn team khác vươn lên. Có lẽ giả dụ như tôi đã có được 400 điểm từ bài bác này thì gần như cthị xã đã khác. Nhưng mặc dù sao “gồm lẽ” vẫn chỉ là 1 trường đoản cú người ta dùng làm bao biện cho lầm lỗi của chính bản thân mình mà lại thôi.Continue reading Whitehat Conchạy thử 12 – Pwn400 →

View all 2 comments Unlinks techniqueApril 7, 2016pwnheaphardtobelieve sầu

Đây là 1 trong những Một trong những chuyên môn cơ bạn dạng dùng để khai quật lỗ hổng ngơi nghỉ vùng nhớ heap

Cấu trúc heap

Glibc tổ chức triển khai 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 không lấy phí. */ struct malloc_chunk* bk; /* Only used for large blocks: pointer khổng lồ next larger kích thước. */ struct malloc_chunk* fd_nextsize; /* double link — used only if không lấy phí. */ struct malloc_chunk* bk_nextsize;; Continue reading Unlink technique →

Leave sầu a bình luận 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 phối 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 , thực hiện urldecode rồi open dòng tệp tin html/js/… cơ mà client trải nghiệm, sau đó trả về content.

Xem thêm: Định Nghĩa Nhà Thông Minh Là Gì ? Nhà Thông Minh Smart Home Là Gì

Kiểm tra hàm CleanURL

Hàm tất cả tác vụ urldecode, tuy nnhân từ hàm đó lại không filter “../” (path traveler) có thể chấp nhận được attacker rất có thể thực hiện “../” để read /etc/passwd (hoặc flag) chẳng hạn

*

Ok easy roài, extract data pynhỏ bé ra thôi – Link

import sysif len(sys.argv) == 13:print “Great: flagg3771ng_st4rt3d_2015”else:print “.”——————————————————————————————————-

RE 200 – upx.exe

string demo chả thấy mẫu UPX! signature nào . decompress lại cho chắc hẳn failed nốt.

*

Run

*

OK boy let”s make it nicely!

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

main là winMain -> sau đó Điện thoại tư vấn hàm sub_4001000

int __stdGọi 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 thanh lịch cho malloc 6600 unknown_libname_41(result, v14 + *(_DWORD *)(v8 + 12), *(_DWORD *)(v8 + 16)); v11 = 0; if ( v7 ) { bởi vì *((_BYTE *)v10 + v11++) ^= 0x11u; while ( v11 thứ nhất nó Điện thoại tư vấn hàm getModuleHandle để tìm kiếm base address của MZ Headerkế tiếp check MZ signature với PE signature ::for sure::

*

find session .alloc

*
*

var A = heapalloc(0x6600)mang đến đoạn unknown_libname_41 này bởi vì mình vô cùng ghét cái gì cứ vệt giếm, cùng một trong những phần nhác trỗi dậy. function thường thì của mscrt thôi cần coi những tmê say số truyền vô với hiệu quả trả về để đoán thù vậy (memcpy)

memcpy(0x41b00, A, 0x6600)for i in range(0x6600):A ^= 0x11*một đoạn memory hơi lâu năm, lại còn bị mã hóa nữa. cấp thiết như thế nào là flag cipher được? Có lẽ làm sao là shellcode?

new_size = *(dword*)A = 0xbe00var B = heapalloc(new_size)sub_406660( &new_size ) => copy MZ_Header -> mang đến B, kích thước = 0xbe00

*

Từ phía trên ta lao vào sub func cuối là sub_401b60

Check các sub prúc, chú ý các string mình thấy cực kỳ liên quan

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

– CreateFileMappingW- MapViewOfFile- VirtualAlloc- GetProcAddress- VirtualQuery- LoadLibraryA- VirtualProtectoke, tkhông nhiều đi ít! run shellcode vững chắc roài ::bem::

ta đặt breakpoint ngơi nghỉ ngay lập tức các sub nhỏ cùng run thứu tự mang đến bao giờ shell được chạy thì vạc hiện tại điểm G

*

sub_401b60 -> sub_401600 -> Call eaxnew entry point = 08001563sử dụng HxD (hex editor) view ram process upx.exe tại địa chỉ đó thì thấy ngulặng session trường đoản cú 0x08000000 -> 0x0800FFFF là một trong tệp tin PE new,

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

sắp tới các bạn có thể extract ra 1 tệp tin exe bắt đầu và disass nghiên cứu và phân tích (ko chắc chắn rằng sẽ chạy đc ok), còn bản thân thì thấy nó tất cả dạng 1 file ms c++ nữa bắt buộc đối chiếu structure với chiếc PE cội nhằm tra cứu addr winMain

can dự 0x08001100quy trình dịch tương tự như, bài xích mới này cũng không thực sự cực nhọc.

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 luôn đến lẹ, patch luôn luôn khu vực strcmp cùng trong func_flag (0x08001000) có một vị trí Gọi isDebuggerPresent (0x08001024)

*

*

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ới test vô số phương pháp input, đều phải có công dụng “Not yet..”

:/media/sf_Desktop/nullcon/re/fin64$ ./fin64Not yet..main khá nđính, ta dịch lần lượtchú ý, gồm 2 dòng good_boy và bad_boy vào hình

*

trước tiên là func_systimegọi syscall 0xc9 để lấy timestamp sao đó lưu lại quý hiếm vào

*

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

*

dừng tại chỗ này, jump ngược trường đoản cú good_boy với bad_boy ta thấy có đoạn áp dụng

*

trường hợp sinh sống không trở nên đổi khác thì đoạn code pseubởi ntn:

giờ ta jump baông xã trường đoản cú đoạn compare trên mang lại tức thì sau địa điểm convert, patch những đoạn jump để bypass khoảng trọng tâm với chạy lại 1 lần nữa

$ ./fin64Oops..Good bj, mình đoán flag bên trong memory, test trace dần vào good_boy

thì phân phát chỉ ra cái này *byte_6c2070

*

next-challenge

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

RE 500 – cso

bài xích này đích thực chần chờ đề nghị viết writeup ra sao vì chưng thừa nhận là nó khá bần và phương pháp làm cũng ngẫu hứng vãi nhái :3

sau hồi dịch bản thân không biết nó là loại như thể gì, có vẻ như giống virtual machine cơ mà cũng ko tương đương lắm =)), hoàn toàn nó nhỏng 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 sầu forever”)super = super_to_quitcontinuecheck_len: if len_st==0x1A: super = super_to_stage2else:super = super_to_deadcontinuestage_2:#func_stage2 tại khu vực 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 vẻ ngoài gì hầu hết nhưng mà nó được build để tính toán thù đúng theo lí#các jump b1, b2, b3, … bn là nhãn của 1 trong những 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#bao gồm thêm 1 số sub function phụKhông biết flag sinh sống ở đâu luôn, code follow control phụ thuộc vào mấy phép cộng của a(i), giờ tìm kiếm quy phương pháp đến nó cũng non giật. Có tuyệt nhất 1 dòng chắc chắn rằng là len_st = 0x1A = 26 (!!!)

Sau 1/2 tiếng xem xét, bản thân thấy lúc input với len = 26 với len Bingo, chuẩn chỉnh girl mất rồi, side channel bem theo 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 kiểu như flag mang đến lắm :-ss

Input test lại vẫn “You are dead man”. Wut dafuq, đúng quá rồi liệu có còn gì khác.Chechồng lại mẫu inscount thì thấy tất cả sự chênh lệch không nhỏ ins.cũng có thể là gần như mini-sub trong stage2 (0x00400ec0)Kiểm tra thứu tự từng mini-sub đó ta thấy bao gồm sub_400BD0 thực hiện trở nên global(s) đó là string input đầu vào ban đầu?!?

*

Đặt breakpoint tức thì tại đó và input quả như trên, sau một số lần trace thì …

*
Âu Mai Gót, Gọi dòng địa chỉ vừa trả về, không phải run shell do đó run đồ vật gi nữa =))