From 45b4fa172fca8983ab8faf370fbd9132940988bb Mon Sep 17 00:00:00 2001 From: danger Date: Fri, 18 Oct 2024 21:01:20 +0800 Subject: [PATCH] first commit --- README.md | 0 input/dprintf | Bin 0 -> 22864 bytes input/dprintf.i64 | Bin 0 -> 200231 bytes input/edit | Bin 0 -> 24896 bytes input/edit.i64 | Bin 0 -> 249881 bytes input/recv | Bin 0 -> 22936 bytes input/recv.i64 | Bin 0 -> 208473 bytes output/dprintf_patch/dprintf | Bin 0 -> 51536 bytes output/edit_patch/edit | Bin 0 -> 53568 bytes output/recv_patch/recv | Bin 0 -> 51608 bytes src/Extract_code | 1 + src/README.md | 0 src/__pycache__/binary_patch.cpython-312.pyc | Bin 0 -> 6301 bytes src/__pycache__/chat.cpython-312.pyc | Bin 0 -> 5499 bytes src/agent.py | 287 ++++++++++++++++++ src/binary_patch.py | 179 +++++++++++ src/chat.py | 106 +++++++ src/chat_log.json | 174 +++++++++++ src/config.ini | 7 + src/danger_func.json | 14 + src/input/dprintf_extract.c | 81 +++++ src/input/dprintf_struct.json | 27 ++ src/input/edit_extract.c | 188 ++++++++++++ src/input/edit_struct.json | 32 ++ src/input/recv_extract.c | 87 ++++++ src/input/recv_struct.json | 27 ++ src/my.log | 4 + src/output/dprintf_extract/patch_dprintf.json | 46 +++ src/output/dprintf_extract/patch_recv.json | 80 +++++ src/output/edit_extract/patch_strcpy.json | 68 +++++ src/output/recv_extract/patch_recv.json | 44 +++ src/output/recv_extract/recv | 8 + src/prompt.json | 50 +++ src/prompt.py | 69 +++++ src/tmp.txt | 1 + 35 files changed, 1580 insertions(+) create mode 100644 README.md create mode 100644 input/dprintf create mode 100644 input/dprintf.i64 create mode 100644 input/edit create mode 100644 input/edit.i64 create mode 100644 input/recv create mode 100644 input/recv.i64 create mode 100755 output/dprintf_patch/dprintf create mode 100755 output/edit_patch/edit create mode 100755 output/recv_patch/recv create mode 160000 src/Extract_code create mode 100644 src/README.md create mode 100644 src/__pycache__/binary_patch.cpython-312.pyc create mode 100644 src/__pycache__/chat.cpython-312.pyc create mode 100644 src/agent.py create mode 100644 src/binary_patch.py create mode 100644 src/chat.py create mode 100644 src/chat_log.json create mode 100644 src/config.ini create mode 100644 src/danger_func.json create mode 100644 src/input/dprintf_extract.c create mode 100644 src/input/dprintf_struct.json create mode 100644 src/input/edit_extract.c create mode 100644 src/input/edit_struct.json create mode 100644 src/input/recv_extract.c create mode 100644 src/input/recv_struct.json create mode 100644 src/my.log create mode 100644 src/output/dprintf_extract/patch_dprintf.json create mode 100644 src/output/dprintf_extract/patch_recv.json create mode 100644 src/output/edit_extract/patch_strcpy.json create mode 100644 src/output/recv_extract/patch_recv.json create mode 100644 src/output/recv_extract/recv create mode 100644 src/prompt.json create mode 100644 src/prompt.py create mode 100644 src/tmp.txt diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/input/dprintf b/input/dprintf new file mode 100644 index 0000000000000000000000000000000000000000..71a72926daf4f0eff0b7b8e9d086bdb37f0f3462 GIT binary patch literal 22864 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 G#eV@DA>;=D literal 0 HcmV?d00001 diff --git a/input/dprintf.i64 b/input/dprintf.i64 new file mode 100644 index 0000000000000000000000000000000000000000..34ec55ab0e4fd63fece2fd39de8caa257ba274d2 GIT binary patch literal 200231 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 S`Mj)>a`}^=2l39MT>cLb>h1>s literal 0 HcmV?d00001 diff --git a/input/recv b/input/recv new file mode 100644 index 0000000000000000000000000000000000000000..5ff921622bb952fabe2e3fa31624f56d7e764da0 GIT binary patch literal 22936 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 J%%Mya{{x~U8Fl~w literal 0 HcmV?d00001 diff --git a/output/edit_patch/edit b/output/edit_patch/edit new file mode 100755 index 0000000000000000000000000000000000000000..f5a8a7d3708a96f9674ffd4228cc0daf26ccce4d GIT binary patch literal 53568 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 I6o}&g088Vbr~m)} literal 0 HcmV?d00001 diff --git a/output/recv_patch/recv b/output/recv_patch/recv new file mode 100755 index 0000000000000000000000000000000000000000..88be3eafcc697bca1b45705fdea73446c0f35a17 GIT binary patch literal 51608 zcmeHQ3v?V;dA>8dBdy+RNw(!j;#F`$285L_p zGs-i?N>KwjD0Qr1U9^lo;Yv{$8d9PNfYPsnjHJ;rx?D;^7-}*krC)K2YF5$PbpwWq zu&Sn?M^?)s9Hj&~D#_Kgk_bbMo!?$W)r&|}F`BN_{WG-GkJyB}m3jDLS}>;o1sp_DBN92Ht|^3uIp+4iNF5Y zji=po?!ImJFL~<+&$;{C|F)_B1GHh@^q~zm#xuJJW!5o{iA!DS_P$b~gdYUoS|S_v zy;bxtt)kyoMZdp_{ z{#8}0Z*aOK8J`{S#+S9PE7^XHx?;_=amOgf&+C$jl?93uALAuUcMQfZMG z8cI&)#b7EuEQZE2xuh7Lnp`E4JCZ{;BtcSnF_zDyb0U>a=HuynW>PQ&_xRP|a`|Lh zKs%NblgVs0lNFQMR60K*Ca3Z_kwp-ZOCoeGna^d0-jG34q{%$`;o>hKOLFGV@j0b| zAvS8qLCx{|xqa`&VIL4pS~s;cRmX^C|DU@giW+s!G{+w0<0bk=D)iP7jY^KEdlQ3- zNQu7mcssj9&*Rf)7sRLa{r%*&ZQcduH-(;c#sCqoGG+5{2`hf_lDi=6`~; ztPr#xW6k{RlZ8TIuavovnxB2#mt848zcK{2-*hMV!ZTHcFyJX!#DhfwN_C7LFG;UcD z6%R`Lw>&G!^jz$rXD^98bUYAqz8rh}#ry(4LamNa>CgRl*F_&iQevv@>e%$rV>e;g zzwG@LG|qL8oYWrefBbfqG>*OHnJ{+#=`WtZz7RXKN5EI+d}vRo$cBq-N0E&b*|Upm zZ;@S7WTQnkR%Evn*=vgI^+k59$W9j79X>m-OC>vSyQX_Jy-U;mntn{v1DYyW4-L#{ z`74?p*7ONYk7#;K(>YC#OM2($iPs%_2;TkFJiw2zrVkyv_XN<~GjnULZ0ExK>`<4@8Y6*hX=wOEs>>$mK{eUgrdG+`2 z7&x)+KAz@c(~m#E(}#?Lluo=*C}4-C_rK#bg^nDX_Psv@ZsgFw5f=$O4JUE1a1Me# z0iTiSfu~}34jhS1KZMv1FuU0FH{g8%eD=)jWWc>T;2J;RRp4O$AWy)s{i$qR+D>ZQ zM&I@fa1XLQM0%a7RTxjhOE-XTV z%m(jQX+NyceCXGOLd(4aPqo}TgWQH-+j8$=G&G~e*)7e%L+#!>29CpU7xLUQGc~WI z69^*HEE~rN`tU8x3bE;dx!9qBCvuNBxP0L$KAutPTrzt@GHX;5+5@+J%)Oq-NFp_!EV~KB`%Olz?;^?e zw)by|sCW^jPNhd9nRH|_lg&rY9IiL_tJcZeR>)*6l|u9&U{7vLY+1KGc2Un%F55Gn z8A^=zZuTZOYD>?~`n4ef=VE8XSzpF_N}Xt2IEOkFSj z8xhmoGg`?i{NMF#p%CFEM05DE=8nr-8g2~j5|=Dpd(OG)2@JL~j{m*Llb4)kV;i^O zKaH4Qr+%P0{5H40sV4BKgH&V=AAx$=&kKdGl+_>f>mNn^Bj^|Jb^88pp6+tv$1y?t zn`c2*o)LvaIZ7g)!DUb>)o$|MHU0jtKjRT@R{b;7+?*tw#HQM_1^d;ZB`Tlspr0K7 z>%nk45S7HI+)=n`YVc$@wpZ=hkX;On%~0dVG2p*_HiYQ-u!=wQ*$@@QmKFhvfJML} zU=gqgSOormAkf4Iu@_|5&+G2(>YI{c-h3-7Wm+v>0bez|YLHgzUHU!# zK2RQ9*@rN~%KmGMqS8QK7MGh!DF{nXIMTSS6ROi9+Uis-1^*sH?moVFEo^E+wbPJl zg0+7M(jKaDLbb@W#;tuliBnSt66Br8z*&ngr-SQ-AO(K|K5+K(SA#4JdU*a;1P@bn z&Z2d+3VCOuZ^6H#)KPOeEbGSM<m~zZq!Y) z*}9K1X5EY6>zA~`hA1!H4iPlC0g9UCvR~mHFbvmz?iQ#*{orfA;4!=i4Z^tg-ukyf zaE140AdT$IyTH^F)h6Lm8K9ze6Fj~5gL7E~{+7B=Q+I$m7J&z-yM@U;N*#;9H>mq6 zbx%;oBJdQ7@ZT`2(DPlW3S9_A=$AUH#i$4!Z+QX44gG{QziNLHLNN3)+MZ~8QxHUW z&!Ea>5m*KNvb89dhk{P%9blSYfWF325u2}tQ0u6O&EI3so#w|FvH9l^>YRmxjM&@_ zvwBt2A-oF_#$^%MhobhMVd>pX9gDz6sk;#l-lwT!5xAeaPt)!Z>R1H6PTd=5$KiEZ z1fHbsFm*qsjz!>k>gth`SD=nXppGf7fL+~|`W4_?H@h6eKqq+j9&#@y_jz*XlY5NZ zCFFiUZX-G38`wsUxCE{v$B$70qvSqE?v3QWLhfdA-zT?++#I=gk_(~;aKwUlL07lE zo+ID7E%+a3r@o^tj!p;poJReU_AL2tkzd-rhdf~ko!&~o!_UG#7+S%x4Q-;nv*q8w zL-{JIZf^Y|$ntRL2i__S$%3~*`eD6f?}q1*hD)iv7TPBpwt^Lnp8-#$++SNnBmG$; z7|U8U?Rg_kk^h&;wMH5iPTUZ1y=@|K1CI~DOy&sJ0miWZx}-rO6A!Kqq?_;zXtMizy2sB zr<;YslaB}lhgDV$IE%{ID@4m%7<`{}?xkAh87p^=FtoGOV;!G`;wC?m1$Ey4akw>c zwXv*@2JXJ`rfvjX)~=+nCZ0BycgWMozAc@6!NNIBn_k(p52mMUDc1BXOjp!1Vqo8a zTh(duen@(^JL5Cxh0`b#F;kWN>{ur90t{cmF>o3e$yE0}b4wG?4$bwf3hbM^MXcnB zS4P8ObRG5}&Vx0u33sC6v|+^ORyl*7PxRE>7gTc}PJo>Gf@R7m|spEtbh*HPGy_`BuH~}sX92V~DsN;ka7^9AbnTnRb0}&!snm3| zaZOgkNu_2<`!ES7m71mPH8HPkru z9yOIG0_XkPVcc>A7LDZGeb=`<453L0Tf{;h#IgfO(DB5^HW;;thRzVVz$>L9xJU$= z*EU?x@TvxCy|bjYW~FFoxVRzEjPA9;;6hxIhMGz&*Wenl?rbQQgQ@R?QxBMiZs(FE zGMx9ShLqqg`lkWw*5xXlSP zH#EphJ3|b%z_{wvTNkryYdh-@y%U#^Z3~<;o7)-!E0(QT;I!6;F)y^E_h@3F?j6?R zi_QW@i!}x^2OO9|G<9)90}@ieu(c(!vp9Dzl?*1gWqwBRqsj8cj!saDr}-U`VEl!% zM4@qdxn3z(@LD(G*T^n0>uATDB!rznE@Xy@z@1TQOPETnU*eSv6|Glt1ki%x55KF1 zKcL1tSR8N9jCW1>o>5yl{2?>yb!K?$)rfe-!E8`_U84^bhDHuvlQGqUhn2Y8b2@9` z+}T(h_m<)=(}@9LXTm2B?1JKmw)$=9VQDKLmiAKM%3)imQR?FXjnhA8ZpU$6z)lJR zrQm_&I4k4_7%zpq1^+qx^D^;X{C^k!uCu~zX^wysvN!=o&1X$;4=iLM&#o^6=kn|t zBPC;=17_Z*T4oMp7(^;xZlGG9j}r))95Ba+s^Ku3N)Oe6kr64 zph=)Ya-Aa!9UJ)RfpJ9^Y>M~;_!jiFwXjCwgY z9_Q<`X!4_BxcYx(d+d}NrfhDZAQUa3Fkh;&Wlr_#xbMw97eHZ=q>ksTVlNWHHf z=^Bl6ZSIY9jifVOcsF?H4PBGjOg=f3&t#!YOFe_&y=5Brt)}r99|hrO9NRYcUlH%Wa`V771O2d|xNiOWt?_kRH>i-g zq0D45p2CACsdRiKF_9YIDRK$TA(VP=S+>IGOAv#JOcm3`YtMvR^<#2}7|-Bo6j@BA zbE(mEa#$vU>{iEV)VCTja=Fw^NkmT$jb-9viS+Pz(tj&jro4W`)^(eTfv3{Cdu!mN zU!rEhvg7gvY?-0X-*0$mERj_ZY+a9NCGS_m_oievBNzY=;}ly$@AS*uITc-|bJgan zF1-@i5t`vdKA{oz8zR&`3d7^7&20m(-m^eofTAtrInbiGR_Zqy4&PR=8mUvrTcT~6N`|ntFz8qRPc*U_{!s+CV zIxzO9I1SLgKla5G5*&3sdgrb(PZvpCwr$@!P%=*HWp>|qjf58mVlfsT9#Z4m-@m1( zO~@?KN10PHeZ!;}!~r*)!MpOMui7)?M0WHB(KD8rNcPA>UQu65O9un%Irqp21=+ICP4(s^p^YnL8jHai0`uciO>7ntd;iNJ=$w1fQxhcG- zFJo0R`R%nm_*wvdHNfw%%I*9et@Pl;fL$*?Je(Zq9uwRfa-dM8GN4mweAU1(75aG8 zY%&ifm8JyCbiRw{35v`~Y4LRhWQuzkq--+3Dxchu?=nLHK;`ydikwuw6DRGU_!$@S zW!q~ZIjDI@AS(3{Sqj0ciBsA0120#!h`p`KUYm;#YyC`x{#F>!UbL0l?}oi2mf~Z0 zrH3fD_n>sdLSgQsXtg-58tg(N5*dxku#zu zw4}uORB_l3M=TPR_a82jUakK3!blNCy|l*)O5L4}C-| z5&J9RA3~z77#FjU`8pHFw!2DvUdo>;{wv@YMtn1lDhi&-VthC3-#;^YUPYfO&KG1p z#;Qnpg?TFb$twCcR*CcND*7y%V*Zu*9D_bmOvC5+dB6g9iTGGF>g&iv@V@|m=6jUn z$_l#I$aY&!x>Dq)1gGlPxv&r8xVWz(emmpfN^zGyzHqT4w>O~VIGXRZ;SRnc>`PCP5~yjb=ZcV)xTvUd5Y{i$#h z@%7hUwQkc!ETlGEx%tv{SH?GAcGO9UmUY>Gv;BOVdGOdJjol6Uxqcz zKz!h;_3~R~u=b1(#I!QDek%;NZ|e7}6N9OEJ~0aIU@oV=eFi)i8$}@#A05vOCdT8# zScGDIGPQ#yCu`#)sdNf6Wj3)hjwM2NC(UwZr3GOmo0v$(ho>ecc49r3!Xl!~_P2i@ zPSkvl4!=8Rcs!m>@;Tysl6mG+L-EN}QpA&TnS|B>1hWyc9ldz)Bk-Ge%=99^U#F}_ zF6YZNnTg5qB&PZ9UNMx-_jPATa(OJ8Fgpz=v&m6@-A*>1pNPXdoy^JgLs^WnHK+Ox zpYnQqpHG>h1T3{QEUWdu^QTO!9?ULN$rU{dWGYwHWwmNiTdtDd5>&3jHwKj{`0YUz zij!w;UIdjH6<5OLYB~RxsYEySM$tW#nV8_S>fLfwyN8p5Q={?3;9xd+19VEtCeow8 zTZ{5CMf3O?u%ywG$BvRUvSN3papf@t-OjX8HlVX7S0TTpD~qNMV8&A#X^Vk6|66mGmB6rT!89`@RwFAJOd_AFal38LRCa)R+247er-66hFPpE&MzDQx*Q^cayj1 z9~C}ck+5l3MaS==gDGu4wm2%QVvChUlOldu5l(E-?VIs4zZWec%H`L-r(z8LMtwUN zwr~7TM540lL_`v?UJ<{nZ2!%uDfN$bMx|}EQ@K2?h+kH={}gJP@vjdz|998J-O8oX z-pGc&A7=P9c;Dar&U?r2>7Rrz_dV0T`JMHM_TRFu7Mx6j-j(u$+$??mSWX@k4C!Uhb{$S?6YvEs!qI8_QLis;e5!|$^ UYK7Qb#sBH6ltre(p+Xe@186R0y8r+H literal 0 HcmV?d00001 diff --git a/src/Extract_code b/src/Extract_code new file mode 160000 index 0000000..9bd4f14 --- /dev/null +++ b/src/Extract_code @@ -0,0 +1 @@ +Subproject commit 9bd4f149a51a3953a9ec15d108e655be11ede790 diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/__pycache__/binary_patch.cpython-312.pyc b/src/__pycache__/binary_patch.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46d7c1cbde26623ad0e53848dbfc49293aee2b3d GIT binary patch literal 6301 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 literal 0 HcmV?d00001 diff --git a/src/__pycache__/chat.cpython-312.pyc b/src/__pycache__/chat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aaba6abef29e868fbcdb26254e46044bf8376270 GIT binary patch literal 5499 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 LOz>-h(2(@sN{(T4 literal 0 HcmV?d00001 diff --git a/src/agent.py b/src/agent.py new file mode 100644 index 0000000..d0c13cf --- /dev/null +++ b/src/agent.py @@ -0,0 +1,287 @@ +import os +import re +import sys +import json +import warnings +import subprocess +from chat import QueryChatGPT, llm_configured, load_config +from typing import Optional, Dict, List, Tuple +from binary_patch import load_binary_file_information, patch_dprintf, patch_recv, patch_strcpy + +DIR = os.path.dirname(os.path.abspath(__file__)) +PROMPT_PATH = os.path.join(DIR, 'prompt.json') +DANGER_FUNC = os.path.join(DIR, 'danger_func.json') +IN_DIR = os.path.join(DIR, 'input') +OUT_DIR = os.path.join(DIR, 'output') +INIT_IN_DIR = os.path.join(os.path.dirname(DIR), 'input') +FINAL_OUT_DIR = os.path.join(os.path.dirname(DIR), 'output') +IDAT64_PATH = "/root/idapro-9.0/idat64" + +def get_prompt(name: str, _type: str, prompt_path: str = PROMPT_PATH) -> Optional[Dict[str, str]]: + """ + Access the prompt + + Args: + name: the name of the prompt + _type: the type of the prompt + prompt_path: the path of the prompt file + + Returns: + a dict containing two keys: 'role' and 'content' + """ + + prompts = None + with open(prompt_path, 'r') as f: + prompts = json.load(f) + assert(prompts) + + for _p in prompts: + if _p['name'] == name and _p['type'] == _type: + return _p['prompt'] + return None + +def read_decompile_code(file_path: str) -> Optional[str]: + if not os.path.exists(file_path): + warnings.warn("Fail to find {file_path}!".format(file_path, file_path)) + sys.exit(1) + with open(file_path, 'r') as r: + code_data = r.read() + return code_data + +def read_struct_data(file_path: str) -> Optional[str]: + if not os.path.exists(file_path): + warnings.warn("Fail to find {file_path}!".format(file_path, file_path)) + sys.exit(1) + with open(file_path, 'r') as r: + struct_data = r.read() + return struct_data + + +def handle_dprintf(file_name: str, code: str, elf_file: str, patch_dprintf_file: str = 'patch_dprintf.json'): + if 'dprintf' not in code: + return + + print("begin to test dprintf in {file_name}.".format(file_name = file_name)) + # generate output file + output_dir = OUT_DIR + '/' + file_name[:-2] + os.makedirs(output_dir, exist_ok=True) + + output_file = output_dir + '/' + patch_dprintf_file + print("The dprintf info store into the " + output_file) + + # get prompt from prompt.json + prompt = get_prompt('dprintf', 'attack') + assert (prompt) + q = QueryChatGPT() + response = q.query(prompt['content'].format(code = code)) + print(response) + + # judge whether the program exists dprintf format string vulnerability + print("response info : " + response[:4].lower()) + if 'yes' not in response[:4].lower(): + return + + # store the relevant information into INPUT_DIR + "patch_dprintf.json" + data = { + "file_path": file_name, + "vul_info": response[4:] # set response[4:] to skip string "yes, " + } + + if not os.path.exists(output_file): + with open(output_file, 'w') as w: + json.dump([], w, indent=4) + + with open(output_file, 'r') as r: + log = json.load(r) + assert (isinstance(log, list)) + + # insert relevant vulnerability info into json file + log.append(data) + + with open(output_file, 'w') as w: + json.dump(log, w, indent=4) + + # invoke patch api here + output_dir = FINAL_OUT_DIR + '/' + elf_file + '_patch' + os.makedirs(output_dir, exist_ok=True) + lief_binary, pwn_binary = load_binary_file_information(INIT_IN_DIR + '/' + elf_file) + patch_dprintf(lief_binary, output_dir + '/' + elf_file) + + +def handle_recv(file_name: str, code: str, elf_file: str, patch_recv_file: str = 'patch_recv.json'): + if 'recv' not in code: + return + + print("begin to test recv in {file_name}.".format(file_name = file_name)) + # generate output file + output_dir = OUT_DIR + '/' + file_name[:-2] + os.makedirs(output_dir, exist_ok=True) + + output_file = output_dir + '/' + patch_recv_file + print("The recv info store into the " + output_file) + + # get prompt from prompt.json + prompt = get_prompt('recv', 'attack') + assert (prompt) + q = QueryChatGPT() + response = q.query(prompt['content'].format(code = code)) + print(response) + # judge whether the program exists buffer overflow vulnerability due to recv func + print("response info : " + response[:4].lower()) + if 'yes' not in response[:4].lower(): + return + + # store the relevant information into INPUT_DIR + "patch_recv.json" + data = { + "file_name": file_name, + "vul_info": response[4:] # set response[4:] to skip string "yes, " + } + + # determine the specific size to fix recv func + # get patch prompt for recv + prompt = get_prompt('recv', 'patch') + assert (prompt) + q = QueryChatGPT() + response = q.query(prompt['content'].format(code = code)) + print(response) + + # record modified size + match = re.search(r'size=(\d+)', response) + data['fix_size'] = int(match.group(1)) + + match = re.search(r',\s*(.*)', response) + data['patch_info'] = match.group(1) + + if not os.path.exists(output_file): + with open(output_file, 'w') as w: + json.dump([], w, indent=4) + + with open(output_file, 'r') as r: + log = json.load(r) + assert (isinstance(log, list)) + + # insert relevant vulnerability info into json file + log.append(data) + + with open(output_file, 'w') as w: + json.dump(log, w, indent=4) + + # invoke patch api here + output_dir = FINAL_OUT_DIR + '/' + elf_file + '_patch' + os.makedirs(output_dir, exist_ok=True) + lief_binary, pwn_binary = load_binary_file_information(INIT_IN_DIR + '/' + elf_file) + patch_recv(lief_binary, data['fix_size'], output_dir + '/' + elf_file) + + +def handle_strcpy(file_name: str, code: str, elf_file: str, struct_data: str, patch_strcpy_file: str = 'patch_strcpy.json'): + if 'strcpy' not in code: + return + + print("begin to test strcpy in {file_name}.".format(file_name = file_name)) + # generate output file + output_dir = OUT_DIR + '/' + file_name[:-2] + os.makedirs(output_dir, exist_ok=True) + + output_file = output_dir + '/' + patch_strcpy_file + print("The recv info store into the " + output_file) + + # get prompt from prompt.json + prompt = get_prompt('strcpy', 'attack') + assert (prompt) + q = QueryChatGPT() + response = q.query(prompt['content'].format(code = code)) + print(response) + # judge whether the program exists buffer overflow vulnerability due to strcpy func + print("response info : " + response[:4].lower()) + if 'yes' not in response[:4].lower(): + return + + # store the relevant information into INPUT_DIR + "strcpy.json" + data = { + "file_name": file_name, + "vul_info": response[4:] # set response[4:] to skip string "yes, " + } + + # determine the specific size to fix strcpy func + # get patch prompt for strcpy + prompt = get_prompt('strcpy', 'struct') + assert (prompt) + q = QueryChatGPT() + response = q.query(prompt['content'].format(struct_data = struct_data)) + print(response) + + prompt = get_prompt('strcpy', 'patch') + assert (prompt) + q = QueryChatGPT() + response = q.query(prompt['content'].format(code = code)) + print(response) + + # record modified size + match = re.search(r'size=(\d+)', response) + data['fix_size'] = int(match.group(1)) + + match = re.search(r',\s*(.*)', response) + data['patch_info'] = match.group(1) + + if not os.path.exists(output_file): + with open(output_file, 'w') as w: + json.dump([], w, indent=4) + + with open(output_file, 'r') as r: + log = json.load(r) + assert (isinstance(log, list)) + + # insert relevant vulnerability info into json file + log.append(data) + + with open(output_file, 'w') as w: + json.dump(log, w, indent=4) + + # invoke patch api here + output_dir = FINAL_OUT_DIR + '/' + elf_file + '_patch' + os.makedirs(output_dir, exist_ok=True) + lief_binary, pwn_binary = load_binary_file_information(INIT_IN_DIR + '/' + elf_file) + patch_strcpy(lief_binary, data['fix_size'], output_dir + '/' + elf_file) + + +def exp(): + print("Trying to test function normally") + + # print arguments + print(sys.argv) + elf_file = sys.argv[1] + + extract_args = ["python3", "test.py", "-e"] + extract_args.append(IDAT64_PATH) + extract_args.append(INIT_IN_DIR + '/' + elf_file) + print(extract_args) + + # extract c_code & struct_info for patch elf file + os.chdir("./Extract_code") + subprocess.run(extract_args, text=True) + os.chdir(os.pardir) + + code_file = elf_file + '_extract.c' + struct_file = elf_file + '_struct.json' + + # # read code which will be used to analyze by LLM + code = read_decompile_code(IN_DIR + "/" + code_file) + struct_data = read_struct_data(IN_DIR + "/" + struct_file) + # read danger_func.json to determine the scope of the func checked + with open(DANGER_FUNC, 'r') as f: + d_func = json.load(f) + assert(d_func) + + for _d in d_func: + if _d['name'] == 'recv': + handle_recv(code_file, code, elf_file) + elif _d['name'] == 'dprintf': + handle_dprintf(code_file, code, elf_file) + elif _d['name'] == 'strcpy': + handle_strcpy(code_file, code, elf_file, struct_data) + +if __name__ == '__main__': + if not llm_configured(): + print('please complete llm access setup first...') + exit() + exp() \ No newline at end of file diff --git a/src/binary_patch.py b/src/binary_patch.py new file mode 100644 index 0000000..11c4c8b --- /dev/null +++ b/src/binary_patch.py @@ -0,0 +1,179 @@ +#!/usr/bin/python3 +import lief +from pwn import * +import os +import sys + +global lief_ELF_ALLOC +lief_ELF_ALLOC = 2 +global lief_ELF_EXCLUDE +lief_ELF_EXECINSTR = 4 + +def get_binary_file_CLASS(binary, output_info=True): + CLASS = CLASS = binary.header.identity_class + str_CLASS = "" + if CLASS == binary.header.CLASS.ELF32: + str_CLASS = "ELF32" + elif CLASS == binary.header.CLASS.ELF64: + str_CLASS = "ELF64" + else: + str_CLASS = "UNKNOWN" + if output_info: + print("[\033[1;34m*\033[0m] CLASS is %s" % (str_CLASS)) + return (CLASS, str_CLASS) + +def get_binary_file_machine_type(binary, output_info=True): + machine_type = binary.header.machine_type + str_machine_type = "" + arch = "" + if machine_type == lief._lief.ELF.ARCH.X86_64: + str_machine_type = "x86_64" + arch = "amd64" + else: + str_machine_type = "UNKNOWN" + arch = "UNKNOWN" + + print('[\033[1;34m*\033[0m] machine type is %s ==> ARCH : %s' % (str_machine_type, arch)) + return (str_machine_type, arch) + +def load_binary_file_information(path): + lief_binary = lief.parse(path) + CLASS, str_CLASS = get_binary_file_CLASS(lief_binary) + str_machine_type, arch = get_binary_file_machine_type(lief_binary) + + pwn_binary = '' + context.arch = arch + if "ELF" in str_CLASS: + context.os = "linux" + pwn_binary = ELF(path) + + return (lief_binary, pwn_binary) + +# flag : lief.ELF.SEGMENT_FLAGS.PF_R | lief.ELF.SEGMENT_FLAGS.PF_W | lief.ELF.SEGMENT_FLAGS.PF_X +def add_segment(lief_binary, content, types, flags, base=0x405000): + segment = lief.ELF.Segment() + segment.type = types + segment.FLAGS.from_value(flags) + segment.content = list(content) + segment.alignment = 8 + segment.add(lief._lief.ELF.Segment.FLAGS.R | lief._lief.ELF.Segment.FLAGS.X) + segment = lief_binary.add(segment, base=base) + print(segment.FLAGS.value) + return segment + +''' +def patch_by_call(start_address_of_call, target_function_address): + # caculate the offset + jmp_offset = target_function_address - (start_address_of_call + 5) + # call + p32(jmp_offset) +''' + +def patch_strcpy(lief_binary, nbytes, save_path, output=True): + print("[\033[1;34m*\033[0m] get the length of buffer is 0x%x(%d)" % (nbytes, nbytes)) + patch_strcpy_code = f""" + save_register: + push rax; + push rcx; + push rdx; + xor rcx, rcx; + loop: + mov rdx, {nbytes-1}; + mov al, [rcx + rsi]; + + cmp rcx, rdx; + jge ret_code; + + test al, al; + je ret_code; + + mov [rdi + rcx], al; + + inc rcx; + jmp loop; + + ret_code: + mov [rsi + rcx], al; + pop rdx; + pop rcx; + pop rax; + ret; + """ + patch_code = asm(patch_strcpy_code) + if output: + print("the assmebly code :\n %s" % patch_strcpy_code) + print("the machine code :\n %s" % patch_code) + + new_segment = add_segment(lief_binary, types = lief._lief.ELF.Segment.TYPE.LOAD, flags = 5, content=patch_code) + lief_binary.patch_pltgot("strcpy", new_segment.virtual_address) + lief_binary.write(save_path) + os.system("chmod +x " + save_path) + + +# to do +def patch_dprintf(lief_binary, save_path, output=True): + patch_dprintf_code = f""" + save_register: + push rdx; + push rcx; + + init_register: + push rsi; + pop rcx; + xor rdx, rdx; + + get_the_buffer_len: + mov al, [rsi+rdx]; + inc rdx; + test al, al; + jnz get_the_buffer_len; + + xor rax, rax; + mov al, 1; + syscall; + + ret_code: + pop rcx; + pop rdx; + ret; + """ + patch_code = asm(patch_dprintf_code) + if output: + print("the assmebly code :\n %s" % patch_dprintf_code) + print("the machine code :\n %s" % patch_code) + new_segment = add_segment(lief_binary, types = lief._lief.ELF.Segment.TYPE.LOAD, flags = 5, content=patch_code) + lief_binary.patch_pltgot("dprintf", new_segment.virtual_address) + lief_binary.write(save_path) + os.system("chmod +x " + save_path) + + +def patch_recv(lief_binary, nbytes, save_path, output=True): + patch_recv_code = f""" + mov rdx, {nbytes} + mov r10, rcx; + xor r8, r8; + xor r9, r9; + push 45; + pop rax; + syscall; + ret; + """ + patch_code = asm(patch_recv_code) + if output: + print("the assmebly code :\n %s" % patch_recv_code) + print("the machine code :\n %s" % patch_code) + new_segment = add_segment(lief_binary, types = lief._lief.ELF.Segment.TYPE.LOAD, flags = 5, content=patch_code) + lief_binary.patch_pltgot("recv", new_segment.virtual_address) + print(save_path) + lief_binary.write(save_path) + os.system("chmod +x " + save_path) + +''' +designed for console command +''' +# if __name__ == '__main__': +# # # argv = sys.argv +# # # argc = len(sys.argv) +# lief_binary, pwn_binary = load_binary_file_information("../input/edit") +# print(lief_binary) +# print(pwn_binary) +# patch_strcpy(lief_binary, 256, "../output/edit_patch/edit") diff --git a/src/chat.py b/src/chat.py new file mode 100644 index 0000000..2cd9e24 --- /dev/null +++ b/src/chat.py @@ -0,0 +1,106 @@ +""" +Interfaces to interact with various LLMs +""" + +import json +import os +import atexit +import configparser +from typing import Dict, Optional, List +from openai import OpenAI + + +CUR_DIR = os.path.dirname(os.path.abspath(__file__)) +CONFIG = os.path.join(CUR_DIR, 'config.ini') + + +def load_config(field: str, value: str) -> str: + + config = configparser.ConfigParser() + config.read(CONFIG) + return config[field][value] + + +def llm_configured() -> bool: + model = load_config('LLM', 'model') + api_key = load_config('LLM', 'api_key') + api_base = load_config('LLM', 'api_base') + + return bool(len(model) and len(api_key) and len(api_base)) + + +class QueryChatGPT(): + """ Interface for interacting with ChatGPT + + """ + + def __init__(self) -> None: + self.chat_context: List[Dict[str, str]] = [] + self.chat_history: List[Dict[str, str]] = [] + self.temperature:float = 0.2 + self.use_history = False + self.system_prompt: Optional[str] = None + atexit.register(self.log_history) + + def clear(self): + self.chat_context = [] + + def set_history(self, open: bool) -> None: + self.use_history = open + + def insert_system_prompt(self, system_prompt: str) -> None: + """ add system_prompt in self.chat_context """ + + if self.chat_context and self.chat_context[0]["role"] == "system": + self.chat_context[0]['content'] = system_prompt + else: + self.chat_context.insert(0, { + "role": "system", + "content": system_prompt + }) + + def log_history(self, log_file: str = 'chat_log.json'): + + if not os.path.exists(log_file): + with open(log_file, 'w') as w: + json.dump([], w, indent=4) + + with open(log_file, 'r') as r: + log = json.load(r) + assert (isinstance(log, list)) + log.append(self.chat_history) + with open(log_file, 'w') as w: + json.dump(log, w, indent=4) + + def __query(self, prompt: str, model: str) -> Optional[str]: + self.chat_context.append({"role": "user", "content": prompt}) + self.chat_history.append({"role": "user", "content": prompt}) + + client = OpenAI(api_key=load_config('LLM', 'api_key'), base_url=load_config('LLM', 'api_base')) + response = client.chat.completions.create( + messages=self.chat_context, # type: ignore + model=model, + temperature=self.temperature, + ) + response_content = str(response.choices[0].message.content) + + self.chat_context.append({ + "role": "assistant", + "content": response_content + }) + self.chat_history.append({ + "role": "assistant", + "content": response_content + }) + + return response_content + + def query(self, + prompt: str, + *, + model: str = load_config('LLM', 'model')) -> Optional[str]: + + response = self.__query(prompt, model) + if not self.use_history: + self.clear() + return response diff --git a/src/chat_log.json b/src/chat_log.json new file mode 100644 index 0000000..8772718 --- /dev/null +++ b/src/chat_log.json @@ -0,0 +1,174 @@ +[ + [], + [], + [ + { + "role": "user", + "content": "How to study english." + }, + { + "role": "assistant", + "content": "1. Start by building a strong foundation in grammar and vocabulary. This will help you understand the structure of the language and communicate effectively.\n\n2. Practice reading and listening to English as much as possible. This can be done through books, newspapers, websites, podcasts, and movies.\n\n3. Practice speaking and writing in English regularly. This will help you improve your fluency and confidence in using the language.\n\n4. Find a language partner or join a language exchange program to practice speaking with native English speakers.\n\n5. Take English language courses or attend language classes to receive formal instruction and guidance.\n\n6. Use online resources and apps to supplement your learning, such as Duolingo, Babbel, or Rosetta Stone.\n\n7. Set specific goals for your English language learning and track your progress to stay motivated.\n\n8. Immerse yourself in the language by surrounding yourself with English-speaking environments, such as watching English TV shows, listening to English music, or participating in English-speaking events.\n\n9. Be patient and consistent in your practice. Learning a new language takes time and effort, so don't get discouraged if progress is slow.\n\n10. Seek feedback from teachers, tutors, or language partners to help identify areas for improvement and continue to refine your language skills." + } + ], + [ + { + "role": "user", + "content": "Please analyze whether the following program contains the risk of buffer overflow and only check recv function. If you find buffer overflow of recv function please tell me the details about it, or else just output 'no recv vulnerability'.\n//Function: echo_handler ->0x4199222 7 perm->5\n// bad sp value at call has been detected, the output may be wrong!\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n if ( recv(sock, &buffer[8], 0x400uLL, 0) <= 0 )\n return 0;\n printf(\"Message from client: %s\\n\", buffer);\n if ( send(sock, \"Hello from server\\n\", 0x12uLL, 0) <= 0 )\n return 0;\n puts(\"Hello message sent\");\n return 1;\n}\n\n\n//Function: main ->0x4199683 7 perm->5\n// bad sp value at call has been detected, the output may be wrong!\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2AFFu);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11007);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200139 7 perm->5\n// bad sp value at call has been detected, the output may be wrong!\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "The recv function in the echo_handler function does not contain a buffer overflow vulnerability. The buffer size is 256 bytes, and the recv function is receiving up to 0x400 bytes (1024 bytes), which is within the bounds of the buffer.\n\nTherefore, there is no recv vulnerability in the provided program." + } + ], + [ + { + "role": "user", + "content": "Please analyze whether the following program contains a dprintf format string vulnerability. If you find dprintf format string vulnerability please answer with 'yes, reason here', or else just output 'no dprintf vulnerability'.\n//Function: echo_handler ->0x4199190 7 perm->5\n// bad sp value at call has been detected, the output may be wrong!\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, &buffer[8], 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\n// bad sp value at call has been detected, the output may be wrong!\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\n// bad sp value at call has been detected, the output may be wrong!\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "yes, there is a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer is directly passed as the format string to the dprintf function without proper formatting. This can potentially lead to a format string vulnerability." + } + ], + [ + { + "role": "user", + "content": "There is a risk of buffer overflow when using strcpy in the program. Please tell me the specific size be prepared for strncpy to ensure the program work safely.\n //Function: add ->0x4199478 7 perm->5\nvoid __cdecl add(char *str)\n{\n Node *newNode; // [rsp+18h] [rbp-8h]\n\n newNode = (Node *)malloc(0x108uLL);\n strcpy(newNode->data, str);\n newNode->next = head;\n head = newNode;\n}\n\n\n//Function: delete ->0x4199559 7 perm->5\nvoid __cdecl delete(char *str)\n{\n Node *entry; // [rsp+10h] [rbp-10h]\n Node **current; // [rsp+18h] [rbp-8h]\n\n for ( current = &head; *current; current = &entry->next )\n {\n entry = *current;\n if ( !strcmp((*current)->data, str) )\n {\n *current = entry->next;\n free(entry);\n return;\n }\n }\n}\n\n\n//Function: edit ->0x4199684 7 perm->5\nvoid __cdecl edit(char *oldStr, char *newStr)\n{\n Node *current; // [rsp+18h] [rbp-8h]\n\n for ( current = head; current; current = current->next )\n {\n if ( !strcmp(current->data, oldStr) )\n {\n strcpy(current->data, newStr);\n return;\n }\n }\n}\n\n//Function: show ->0x4199787 7 perm->5\nvoid __cdecl show(int client_sock)\n{\n size_t v1; // rax\n char buffer[1024]; // [rsp+10h] [rbp-410h] BYREF\n Node *current; // [rsp+418h] [rbp-8h]\n\n for ( current = head; current; current = current->next )\n {\n snprintf(buffer, 0x400uLL, \"%s\\n\", current->data);\n v1 = strlen(buffer);\n send(client_sock, buffer, v1, 0);\n }\n}\n\n//Function: main ->0x4199929 7 perm->5\n// local variable allocation has failed, the output may be wrong!\n// bad sp value at call has been detected, the output may be wrong!\nint __fastcall __noreturn main(int argc, const char **argv, const char **envp)\n{\n int opt; // [rsp+Ch] [rbp-C44h] BYREF\n char arg2[1024]; // [rsp+10h] [rbp-C40h] BYREF\n char arg1[1035]; // [rsp+410h] [rbp-840h] BYREF\n char command[5]; // [rsp+81Bh] [rbp-435h] BYREF\n _BYTE buffer[1032]; // [rsp+820h] [rbp-430h] OVERLAPPED BYREF\n int addrlen; // [rsp+C2Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+C30h] [rbp-20h] BYREF\n int new_socket; // [rsp+C48h] [rbp-8h]\n int server_fd; // [rsp+C4Ch] [rbp-4h]\n\n addrlen = 16;\n *(_QWORD *)buffer = 0LL;\n *(_QWORD *)&buffer[8] = 0LL;\n memset(&buffer[24], 0, 0x3F0uLL);\n opt = 1;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B04u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"Server listening on port %d\\n\", 11012);\n while ( 1 )\n {\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n break;\n read(new_socket, buffer, 0x400uLL);\n memset(command, 0, sizeof(command));\n memset(arg1, 0, 0x400uLL);\n memset(arg2, 0, sizeof(arg2));\n ((void (*)(_BYTE *, const char *, ...))__isoc99_sscanf)(buffer, \"%4s %1023s %1023s\", command, arg1, arg2);\n if ( !strcmp(command, \"ADD\") )\n {\n add(arg1);\n }\n else if ( !strcmp(command, \"DEL\") )\n {\n delete(arg1);\n }\n else if ( !strcmp(command, \"EDIT\") )\n {\n edit(arg1, arg2);\n }\n else if ( !strcmp(command, \"SHOW\") )\n {\n show(new_socket);\n }\n else\n {\n puts(\"Unknown command.\");\n }\n close(new_socket);\n }\n perror(\"accept\");\n exit(1);\n}\n\n\n//Function: backdoor ->0x4200706 7 perm->5\n// bad sp value at call has been detected, the output may be wrong!\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-40h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-30h] BYREF\n sockaddr_in serv_addr; // [rsp+20h] [rbp-20h] BYREF\n int sock; // [rsp+3Ch] [rbp-4h]\n\n new_argv[0] = \"/bin/sh\";\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n sock = socket(2, 1, 0);\n if ( sock >= 0 )\n {\n serv_addr.sin_family = 2;\n serv_addr.sin_port = htons(0x2EECu);\n if ( inet_pton(2, \"127.0.0.1\", &serv_addr.sin_addr) > 0 )\n {\n if ( connect(sock, (const struct sockaddr *)&serv_addr, 0x10u) >= 0 )\n {\n dup2(sock, 0);\n dup2(sock, 1);\n dup2(sock, 2);\n execve(new_argv[0], new_argv, new_envp);\n return 0;\n }\n else\n {\n puts(\"\\nConnection Failed \");\n return -1;\n }\n }\n else\n {\n puts(\"\\nInvalid address/ Address not supported \");\n return -1;\n }\n }\n else\n {\n puts(\"\\n Socket creation error \");\n return -1;\n }\n}\n\n\n" + }, + { + "role": "assistant", + "content": "To prevent buffer overflow when using strncpy in the program, you should ensure that the size parameter passed to strncpy is the maximum size of the destination buffer minus 1. In this case, the destination buffer is defined as \"newNode->data\" with a size of 0x108 bytes.\n\nTherefore, the specific size to be prepared for strncpy in the program to ensure safety would be 0x107 (0x108 - 1) or 263 in decimal. This means that strncpy should be called with a size parameter of 263 to ensure that it does not overflow the destination buffer." + } + ], + [ + { + "role": "user", + "content": "Please analyze the following code to determine if the strcpy used in the program poses a risk of buffer overflow. If it actually exists then answer with 'yes, reason here', or else output 'no strcpy vulnerability'.\n //Function: add ->0x4199478 7 perm->5\nvoid __cdecl add(char *str)\n{\n Node *newNode; // [rsp+18h] [rbp-8h]\n\n newNode = (Node *)malloc(0x108uLL);\n strcpy(newNode->data, str);\n newNode->next = head;\n head = newNode;\n}\n\n\n//Function: delete ->0x4199559 7 perm->5\nvoid __cdecl delete(char *str)\n{\n Node *entry; // [rsp+10h] [rbp-10h]\n Node **current; // [rsp+18h] [rbp-8h]\n\n for ( current = &head; *current; current = &entry->next )\n {\n entry = *current;\n if ( !strcmp((*current)->data, str) )\n {\n *current = entry->next;\n free(entry);\n return;\n }\n }\n}\n\n\n//Function: edit ->0x4199684 7 perm->5\nvoid __cdecl edit(char *oldStr, char *newStr)\n{\n Node *current; // [rsp+18h] [rbp-8h]\n\n for ( current = head; current; current = current->next )\n {\n if ( !strcmp(current->data, oldStr) )\n {\n strcpy(current->data, newStr);\n return;\n }\n }\n}\n\n//Function: show ->0x4199787 7 perm->5\nvoid __cdecl show(int client_sock)\n{\n size_t v1; // rax\n char buffer[1024]; // [rsp+10h] [rbp-410h] BYREF\n Node *current; // [rsp+418h] [rbp-8h]\n\n for ( current = head; current; current = current->next )\n {\n snprintf(buffer, 0x400uLL, \"%s\\n\", current->data);\n v1 = strlen(buffer);\n send(client_sock, buffer, v1, 0);\n }\n}\n\n//Function: main ->0x4199929 7 perm->5\n// local variable allocation has failed, the output may be wrong!\n// bad sp value at call has been detected, the output may be wrong!\nint __fastcall __noreturn main(int argc, const char **argv, const char **envp)\n{\n int opt; // [rsp+Ch] [rbp-C44h] BYREF\n char arg2[1024]; // [rsp+10h] [rbp-C40h] BYREF\n char arg1[1035]; // [rsp+410h] [rbp-840h] BYREF\n char command[5]; // [rsp+81Bh] [rbp-435h] BYREF\n _BYTE buffer[1032]; // [rsp+820h] [rbp-430h] OVERLAPPED BYREF\n int addrlen; // [rsp+C2Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+C30h] [rbp-20h] BYREF\n int new_socket; // [rsp+C48h] [rbp-8h]\n int server_fd; // [rsp+C4Ch] [rbp-4h]\n\n addrlen = 16;\n *(_QWORD *)buffer = 0LL;\n *(_QWORD *)&buffer[8] = 0LL;\n memset(&buffer[24], 0, 0x3F0uLL);\n opt = 1;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B04u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"Server listening on port %d\\n\", 11012);\n while ( 1 )\n {\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n break;\n read(new_socket, buffer, 0x400uLL);\n memset(command, 0, sizeof(command));\n memset(arg1, 0, 0x400uLL);\n memset(arg2, 0, sizeof(arg2));\n ((void (*)(_BYTE *, const char *, ...))__isoc99_sscanf)(buffer, \"%4s %1023s %1023s\", command, arg1, arg2);\n if ( !strcmp(command, \"ADD\") )\n {\n add(arg1);\n }\n else if ( !strcmp(command, \"DEL\") )\n {\n delete(arg1);\n }\n else if ( !strcmp(command, \"EDIT\") )\n {\n edit(arg1, arg2);\n }\n else if ( !strcmp(command, \"SHOW\") )\n {\n show(new_socket);\n }\n else\n {\n puts(\"Unknown command.\");\n }\n close(new_socket);\n }\n perror(\"accept\");\n exit(1);\n}\n\n\n//Function: backdoor ->0x4200706 7 perm->5\n// bad sp value at call has been detected, the output may be wrong!\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-40h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-30h] BYREF\n sockaddr_in serv_addr; // [rsp+20h] [rbp-20h] BYREF\n int sock; // [rsp+3Ch] [rbp-4h]\n\n new_argv[0] = \"/bin/sh\";\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n sock = socket(2, 1, 0);\n if ( sock >= 0 )\n {\n serv_addr.sin_family = 2;\n serv_addr.sin_port = htons(0x2EECu);\n if ( inet_pton(2, \"127.0.0.1\", &serv_addr.sin_addr) > 0 )\n {\n if ( connect(sock, (const struct sockaddr *)&serv_addr, 0x10u) >= 0 )\n {\n dup2(sock, 0);\n dup2(sock, 1);\n dup2(sock, 2);\n execve(new_argv[0], new_argv, new_envp);\n return 0;\n }\n else\n {\n puts(\"\\nConnection Failed \");\n return -1;\n }\n }\n else\n {\n puts(\"\\nInvalid address/ Address not supported \");\n return -1;\n }\n }\n else\n {\n puts(\"\\n Socket creation error \");\n return -1;\n }\n}\n\n\n" + }, + { + "role": "assistant", + "content": "Yes, there is a strcpy vulnerability in the code. The strcpy function is used in the 'add' and 'edit' functions without checking the length of the input string 'str' before copying it into the 'data' field of the 'Node' struct. This can lead to a buffer overflow if the input string is larger than the allocated memory for 'data'." + } + ], + [ + { + "role": "user", + "content": "Please analyze whether the following program contains a dprintf format string vulnerability. If you find dprintf format string vulnerability please answer with 'yes, reason here', or else just output 'no dprintf vulnerability'.\n//Function: echo_handler ->0x4199190 7 perm->5\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "no dprintf vulnerability" + } + ], + [ + { + "role": "user", + "content": "There is a risk of buffer overflow when using recv in the program. Please tell me the specific size be prepared for recv to ensure the program work safely. Answer with 'size=value, ', and then give me the reason.\n//Function: echo_handler ->0x4199190 7 perm->5\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "size=255, The buffer size in the echo_handler function is 256 bytes, so the maximum size for recv should be 255 bytes to prevent buffer overflow. This leaves one byte for the null terminator." + } + ], + [ + { + "role": "user", + "content": "Please analyze whether the following program contains the risk of buffer overflow and only check recv function. If it actually exists then answer with 'yes, reason here', or else output 'no recv vulnerability'.\n//Function: echo_handler ->0x4199190 7 perm->5\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "Yes, the program contains the risk of buffer overflow in the recv function. The recv function is used to receive data from a socket into the buffer array, but the size of the buffer is fixed at 256 bytes. If the data received from the socket is larger than 256 bytes, it can lead to a buffer overflow vulnerability." + } + ], + [ + { + "role": "user", + "content": "Please analyze whether the following program contains a dprintf format string vulnerability. If you find dprintf format string vulnerability please answer with 'yes, reason here', or else output 'no dprintf vulnerability'.\n//Function: echo_handler ->0x4199190 7 perm->5\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "no dprintf vulnerability" + } + ], + [ + { + "role": "user", + "content": "There is a risk of buffer overflow when using recv in the program. Please tell me the specific size be prepared for recv to ensure the program work safely. Answer with 'size=value, ', and then give me the reason.\n//Function: echo_handler ->0x4199190 7 perm->5\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "size=255, The buffer size should be set to 255 to ensure that there is enough space for the received data as recv function reads up to the specified size - 1 bytes and adds a null terminator at the end. This prevents buffer overflow and ensures the program works safely." + } + ], + [ + { + "role": "user", + "content": "Please analyze whether the following program contains the risk of buffer overflow and only check recv function. If it actually exists then answer with 'yes, reason here', or else output 'no recv vulnerability'.\n//Function: echo_handler ->0x4199190 7 perm->5\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "Yes, reason: The recv function in the echo_handler function reads up to 256 bytes into the buffer array, which is only allocated 256 bytes. This means that if more than 256 bytes are received, a buffer overflow can occur." + } + ], + [ + { + "role": "user", + "content": "Please analyze whether the following program contains a dprintf format string vulnerability. If you find dprintf format string vulnerability please answer with 'yes, reason here', or else output 'no dprintf vulnerability'.\n//Function: echo_handler ->0x4199190 7 perm->5\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "no dprintf vulnerability" + } + ], + [ + { + "role": "user", + "content": "Please analyze whether the following program contains a dprintf format string vulnerability. If you find dprintf format string vulnerability please answer with 'yes, reason here', or else output 'no dprintf vulnerability'.\n//Function: echo_handler ->0x4199190 7 perm->5\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "no dprintf vulnerability" + } + ], + [ + { + "role": "user", + "content": "Please analyze whether the following program contains a dprintf format string vulnerability. If you find dprintf format string vulnerability please answer with 'yes, reason here'.\n//Function: echo_handler ->0x4199190 7 perm->5\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "Yes, the program contains a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer variable is directly passed as the format string to the dprintf function without proper formatting. This can allow an attacker to exploit the format string vulnerability and potentially execute arbitrary code." + } + ], + [ + { + "role": "user", + "content": "Please analyze whether the following program contains a dprintf format string vulnerability. If you find dprintf format string vulnerability please answer with 'yes, reason here'.\n//Function: echo_handler ->0x4199190 7 perm->5\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "Yes, the program contains a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer is directly passed as the format string to the dprintf function without proper formatting. This can potentially lead to a format string vulnerability if an attacker can control the contents of the buffer." + } + ], + [ + { + "role": "user", + "content": "There is a risk of buffer overflow when using recv in the program. Please tell me the specific size be prepared for recv to ensure the program work safely. Answer with 'size=value, ', and then give me the reason.\n//Function: echo_handler ->0x4199190 7 perm->5\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "size=255, The buffer size should be set to 255 to ensure that there is enough space to store the received data without causing a buffer overflow. The buffer size is set to 256 in the code, but since strings in C are null-terminated, only 255 characters can be safely stored in the buffer to prevent overflow." + } + ], + [ + { + "role": "user", + "content": "Please analyze whether the following program contains the risk of buffer overflow and only check recv function. If it actually exists then answer with 'yes, reason here', or else output 'no recv vulnerability'.\n//Function: echo_handler ->0x4199190 7 perm->5\nint __cdecl echo_handler(int sock)\n{\n char buffer[256]; // [rsp+10h] [rbp-100h] BYREF\n\n memset(buffer, 0, sizeof(buffer));\n return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0;\n}\n\n\n//Function: main ->0x4199603 7 perm->5\nint __fastcall main(int argc, const char **argv, const char **envp)\n{\n uint16_t v3; // ax\n char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF\n int addrlen; // [rsp+18h] [rbp-28h] BYREF\n int opt; // [rsp+1Ch] [rbp-24h] BYREF\n sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF\n int new_socket; // [rsp+38h] [rbp-8h]\n int server_fd; // [rsp+3Ch] [rbp-4h]\n\n opt = 1;\n addrlen = 16;\n server_fd = socket(2, 1, 0);\n if ( !server_fd )\n {\n perror(\"socket failed\");\n exit(1);\n }\n if ( setsockopt(server_fd, 1, 15, &opt, 4u) )\n {\n perror(\"setsockopt\");\n exit(1);\n }\n address.sin_family = 2;\n address.sin_addr.s_addr = 0;\n address.sin_port = htons(0x2B00u);\n if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 )\n {\n perror(\"bind failed\");\n exit(1);\n }\n if ( listen(server_fd, 3) < 0 )\n {\n perror(\"listen\");\n exit(1);\n }\n printf(\"TCP server listening on port %d\\n\", 11008);\n new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);\n if ( new_socket < 0 )\n {\n perror(\"accept\");\n exit(1);\n }\n inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u);\n v3 = ntohs(address.sin_port);\n printf(\"Accept %s:%d\\n\", client_addr_str, v3);\n while ( echo_handler(new_socket) )\n ;\n close(new_socket);\n return 0;\n}\n\n\n//Function: backdoor ->0x4200059 7 perm->5\nint __cdecl backdoor()\n{\n char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF\n char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF\n\n new_argv[1] = 0LL;\n new_envp[0] = \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\";\n new_envp[1] = 0LL;\n dup2(4, 0);\n dup2(4, 1);\n dup2(4, 2);\n execve(\"/bin/sh\", new_argv, new_envp);\n return 0;\n}\n\n\n" + }, + { + "role": "assistant", + "content": "Yes, reason: The recv function in the echo_handler function does not check the size of the buffer being passed to it, which can lead to a buffer overflow if the data received is larger than the buffer size of 256 bytes." + } + ] +] \ No newline at end of file diff --git a/src/config.ini b/src/config.ini new file mode 100644 index 0000000..9651ce4 --- /dev/null +++ b/src/config.ini @@ -0,0 +1,7 @@ +[LLM] +model = gpt-3.5-turbo +api_key = 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 +api_base = https://api.openai.com/v1/ + +; For openai online LLMs, the default api_base is https://api.openai.com/v1/ +; For local LLMs, the api_base is usually like http://ip:port/v1/ \ No newline at end of file diff --git a/src/danger_func.json b/src/danger_func.json new file mode 100644 index 0000000..d5612f8 --- /dev/null +++ b/src/danger_func.json @@ -0,0 +1,14 @@ +[ + { + "type": "buffer_overflow", + "name": "strcpy" + }, + { + "type": "buffer_overflow", + "name": "recv" + }, + { + "type": "format_string", + "name": "dprintf" + } +] \ No newline at end of file diff --git a/src/input/dprintf_extract.c b/src/input/dprintf_extract.c new file mode 100644 index 0000000..2f8c374 --- /dev/null +++ b/src/input/dprintf_extract.c @@ -0,0 +1,81 @@ +//Function: echo_handler ->0x4199190 7 perm->5 +int __cdecl echo_handler(int sock) +{ + char buffer[256]; // [rsp+10h] [rbp-100h] BYREF + + memset(buffer, 0, sizeof(buffer)); + return recv(sock, buffer, 0x100uLL, 0) > 0 && dprintf(sock, buffer) > 0; +} + + +//Function: main ->0x4199603 7 perm->5 +int __fastcall main(int argc, const char **argv, const char **envp) +{ + uint16_t v3; // ax + char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF + int addrlen; // [rsp+18h] [rbp-28h] BYREF + int opt; // [rsp+1Ch] [rbp-24h] BYREF + sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF + int new_socket; // [rsp+38h] [rbp-8h] + int server_fd; // [rsp+3Ch] [rbp-4h] + + opt = 1; + addrlen = 16; + server_fd = socket(2, 1, 0); + if ( !server_fd ) + { + perror("socket failed"); + exit(1); + } + if ( setsockopt(server_fd, 1, 15, &opt, 4u) ) + { + perror("setsockopt"); + exit(1); + } + address.sin_family = 2; + address.sin_addr.s_addr = 0; + address.sin_port = htons(0x2B00u); + if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 ) + { + perror("bind failed"); + exit(1); + } + if ( listen(server_fd, 3) < 0 ) + { + perror("listen"); + exit(1); + } + printf("TCP server listening on port %d\n", 11008); + new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen); + if ( new_socket < 0 ) + { + perror("accept"); + exit(1); + } + inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u); + v3 = ntohs(address.sin_port); + printf("Accept %s:%d\n", client_addr_str, v3); + while ( echo_handler(new_socket) ) + ; + close(new_socket); + return 0; +} + + +//Function: backdoor ->0x4200059 7 perm->5 +int __cdecl backdoor() +{ + char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF + char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF + + new_argv[1] = 0LL; + new_envp[0] = "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"; + new_envp[1] = 0LL; + dup2(4, 0); + dup2(4, 1); + dup2(4, 2); + execve("/bin/sh", new_argv, new_envp); + return 0; +} + + diff --git a/src/input/dprintf_struct.json b/src/input/dprintf_struct.json new file mode 100644 index 0000000..3f786ba --- /dev/null +++ b/src/input/dprintf_struct.json @@ -0,0 +1,27 @@ +[ + { + "name": "in6_addr", + "size": "0x10", + "info": "struct {in6_addr::$B80A5568EDCB3DEA112C17957211D170 __in6_u;}" + }, + { + "name": "in_addr", + "size": "0x4", + "info": "struct {in_addr_t s_addr;}" + }, + { + "name": "sockaddr_in6", + "size": "0x1c", + "info": "struct {sa_family_t sin6_family;in_port_t sin6_port;uint32_t sin6_flowinfo;in6_addr sin6_addr;uint32_t sin6_scope_id;}" + }, + { + "name": "sockaddr_in", + "size": "0x10", + "info": "struct {sa_family_t sin_family;in_port_t sin_port;in_addr sin_addr;unsigned __int8 sin_zero[8];}" + }, + { + "name": "sockaddr", + "size": "0x10", + "info": "struct {sa_family_t sa_family;char sa_data[14];}" + } +] \ No newline at end of file diff --git a/src/input/edit_extract.c b/src/input/edit_extract.c new file mode 100644 index 0000000..1d7700e --- /dev/null +++ b/src/input/edit_extract.c @@ -0,0 +1,188 @@ +//Function: add ->0x4199478 7 perm->5 +void __cdecl add(char *str) +{ + Node *newNode; // [rsp+18h] [rbp-8h] + + newNode = (Node *)malloc(0x108uLL); + strcpy(newNode->data, str); + newNode->next = head; + head = newNode; +} + + +//Function: delete ->0x4199559 7 perm->5 +void __cdecl delete(char *str) +{ + Node *entry; // [rsp+10h] [rbp-10h] + Node **current; // [rsp+18h] [rbp-8h] + + for ( current = &head; *current; current = &entry->next ) + { + entry = *current; + if ( !strcmp((*current)->data, str) ) + { + *current = entry->next; + free(entry); + return; + } + } +} + + +//Function: edit ->0x4199684 7 perm->5 +void __cdecl edit(char *oldStr, char *newStr) +{ + Node *current; // [rsp+18h] [rbp-8h] + + for ( current = head; current; current = current->next ) + { + if ( !strcmp(current->data, oldStr) ) + { + strcpy(current->data, newStr); + return; + } + } +} + + +//Function: show ->0x4199787 7 perm->5 +void __cdecl show(int client_sock) +{ + size_t v1; // rax + char buffer[1032]; // [rsp+10h] [rbp-410h] BYREF + Node *current; // [rsp+418h] [rbp-8h] + + for ( current = head; current; current = current->next ) + { + snprintf(buffer, 0x400uLL, "%s\n", current->data); + v1 = strlen(buffer); + send(client_sock, buffer, v1, 0); + } +} + + +//Function: main ->0x4199929 7 perm->5 +int __fastcall __noreturn main(int argc, const char **argv, const char **envp) +{ + int opt; // [rsp+Ch] [rbp-C44h] BYREF + char arg2[1024]; // [rsp+10h] [rbp-C40h] BYREF + char arg1[1035]; // [rsp+410h] [rbp-840h] BYREF + char command[5]; // [rsp+81Bh] [rbp-435h] BYREF + char buffer[1024]; // [rsp+820h] [rbp-430h] BYREF + int addrlen; // [rsp+C2Ch] [rbp-24h] BYREF + sockaddr_in address; // [rsp+C30h] [rbp-20h] BYREF + int new_socket; // [rsp+C48h] [rbp-8h] + int server_fd; // [rsp+C4Ch] [rbp-4h] + + addrlen = 16; + memset(buffer, 0, sizeof(buffer)); + opt = 1; + server_fd = socket(2, 1, 0); + if ( !server_fd ) + { + perror("socket failed"); + exit(1); + } + if ( setsockopt(server_fd, 1, 15, &opt, 4u) ) + { + perror("setsockopt"); + exit(1); + } + address.sin_family = 2; + address.sin_addr.s_addr = 0; + address.sin_port = htons(0x2B04u); + if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 ) + { + perror("bind failed"); + exit(1); + } + if ( listen(server_fd, 3) < 0 ) + { + perror("listen"); + exit(1); + } + printf("Server listening on port %d\n", 11012); + while ( 1 ) + { + new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen); + if ( new_socket < 0 ) + break; + read(new_socket, buffer, 0x400uLL); + memset(command, 0, sizeof(command)); + memset(arg1, 0, 0x400uLL); + memset(arg2, 0, sizeof(arg2)); + __isoc99_sscanf(buffer, "%4s %1023s %1023s", command, arg1, arg2); + if ( !strcmp(command, "ADD") ) + { + add(arg1); + } + else if ( !strcmp(command, "DEL") ) + { + delete(arg1); + } + else if ( !strcmp(command, "EDIT") ) + { + edit(arg1, arg2); + } + else if ( !strcmp(command, "SHOW") ) + { + show(new_socket); + } + else + { + puts("Unknown command."); + } + close(new_socket); + } + perror("accept"); + exit(1); +} + + +//Function: backdoor ->0x4200706 7 perm->5 +int __cdecl backdoor() +{ + char *new_envp[2]; // [rsp+0h] [rbp-40h] BYREF + char *new_argv[2]; // [rsp+10h] [rbp-30h] BYREF + sockaddr_in serv_addr; // [rsp+20h] [rbp-20h] BYREF + int sock; // [rsp+3Ch] [rbp-4h] + + new_argv[0] = "/bin/sh"; + new_argv[1] = 0LL; + new_envp[0] = "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"; + new_envp[1] = 0LL; + sock = socket(2, 1, 0); + if ( sock >= 0 ) + { + serv_addr.sin_family = 2; + serv_addr.sin_port = htons(0x2EECu); + if ( inet_pton(2, "127.0.0.1", &serv_addr.sin_addr) > 0 ) + { + if ( connect(sock, (const struct sockaddr *)&serv_addr, 0x10u) >= 0 ) + { + dup2(sock, 0); + dup2(sock, 1); + dup2(sock, 2); + execve(new_argv[0], new_argv, new_envp); + return 0; + } + else + { + puts("\nConnection Failed "); + return -1; + } + } + else + { + puts("\nInvalid address/ Address not supported "); + return -1; + } + } + else + { + puts("\n Socket creation error "); + return -1; + } +} + + diff --git a/src/input/edit_struct.json b/src/input/edit_struct.json new file mode 100644 index 0000000..371cfd0 --- /dev/null +++ b/src/input/edit_struct.json @@ -0,0 +1,32 @@ +[ + { + "name": "in6_addr", + "size": "0x10", + "info": "struct {in6_addr::$B80A5568EDCB3DEA112C17957211D170 __in6_u;}" + }, + { + "name": "in_addr", + "size": "0x4", + "info": "struct {in_addr_t s_addr;}" + }, + { + "name": "sockaddr_in6", + "size": "0x1c", + "info": "struct {sa_family_t sin6_family;in_port_t sin6_port;uint32_t sin6_flowinfo;in6_addr sin6_addr;uint32_t sin6_scope_id;}" + }, + { + "name": "sockaddr_in", + "size": "0x10", + "info": "struct {sa_family_t sin_family;in_port_t sin_port;in_addr sin_addr;unsigned __int8 sin_zero[8];}" + }, + { + "name": "sockaddr", + "size": "0x10", + "info": "struct {sa_family_t sa_family;char sa_data[14];}" + }, + { + "name": "Node", + "size": "0x108", + "info": "struct {char data[256];Node *next;}" + } +] \ No newline at end of file diff --git a/src/input/recv_extract.c b/src/input/recv_extract.c new file mode 100644 index 0000000..7b48d77 --- /dev/null +++ b/src/input/recv_extract.c @@ -0,0 +1,87 @@ +//Function: echo_handler ->0x4199222 7 perm->5 +int __cdecl echo_handler(int sock) +{ + char buffer[256]; // [rsp+10h] [rbp-100h] BYREF + + memset(buffer, 0, sizeof(buffer)); + if ( recv(sock, buffer, 0x400uLL, 0) <= 0 ) + return 0; + printf("Message from client: %s\n", buffer); + if ( send(sock, "Hello from server\n", 0x12uLL, 0) <= 0 ) + return 0; + puts("Hello message sent"); + return 1; +} + + +//Function: main ->0x4199683 7 perm->5 +int __fastcall main(int argc, const char **argv, const char **envp) +{ + uint16_t v3; // ax + char client_addr_str[24]; // [rsp+0h] [rbp-40h] BYREF + int addrlen; // [rsp+18h] [rbp-28h] BYREF + int opt; // [rsp+1Ch] [rbp-24h] BYREF + sockaddr_in address; // [rsp+20h] [rbp-20h] BYREF + int new_socket; // [rsp+38h] [rbp-8h] + int server_fd; // [rsp+3Ch] [rbp-4h] + + opt = 1; + addrlen = 16; + server_fd = socket(2, 1, 0); + if ( !server_fd ) + { + perror("socket failed"); + exit(1); + } + if ( setsockopt(server_fd, 1, 15, &opt, 4u) ) + { + perror("setsockopt"); + exit(1); + } + address.sin_family = 2; + address.sin_addr.s_addr = 0; + address.sin_port = htons(0x2AFFu); + if ( bind(server_fd, (const struct sockaddr *)&address, 0x10u) < 0 ) + { + perror("bind failed"); + exit(1); + } + if ( listen(server_fd, 3) < 0 ) + { + perror("listen"); + exit(1); + } + printf("TCP server listening on port %d\n", 11007); + new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen); + if ( new_socket < 0 ) + { + perror("accept"); + exit(1); + } + inet_ntop(2, &address.sin_addr, client_addr_str, 0x10u); + v3 = ntohs(address.sin_port); + printf("Accept %s:%d\n", client_addr_str, v3); + while ( echo_handler(new_socket) ) + ; + close(new_socket); + return 0; +} + + +//Function: backdoor ->0x4200139 7 perm->5 +int __cdecl backdoor() +{ + char *new_envp[2]; // [rsp+0h] [rbp-20h] BYREF + char *new_argv[2]; // [rsp+10h] [rbp-10h] BYREF + + new_argv[1] = 0LL; + new_envp[0] = "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"; + new_envp[1] = 0LL; + dup2(4, 0); + dup2(4, 1); + dup2(4, 2); + execve("/bin/sh", new_argv, new_envp); + return 0; +} + + diff --git a/src/input/recv_struct.json b/src/input/recv_struct.json new file mode 100644 index 0000000..3f786ba --- /dev/null +++ b/src/input/recv_struct.json @@ -0,0 +1,27 @@ +[ + { + "name": "in6_addr", + "size": "0x10", + "info": "struct {in6_addr::$B80A5568EDCB3DEA112C17957211D170 __in6_u;}" + }, + { + "name": "in_addr", + "size": "0x4", + "info": "struct {in_addr_t s_addr;}" + }, + { + "name": "sockaddr_in6", + "size": "0x1c", + "info": "struct {sa_family_t sin6_family;in_port_t sin6_port;uint32_t sin6_flowinfo;in6_addr sin6_addr;uint32_t sin6_scope_id;}" + }, + { + "name": "sockaddr_in", + "size": "0x10", + "info": "struct {sa_family_t sin_family;in_port_t sin_port;in_addr sin_addr;unsigned __int8 sin_zero[8];}" + }, + { + "name": "sockaddr", + "size": "0x10", + "info": "struct {sa_family_t sa_family;char sa_data[14];}" + } +] \ No newline at end of file diff --git a/src/my.log b/src/my.log new file mode 100644 index 0000000..35915e1 --- /dev/null +++ b/src/my.log @@ -0,0 +1,4 @@ +Extract_Functions /root/Program/input/dprintf-> Command '/root/idapro-9.0/idat64 -A -B -S"interface_extract.py" /root/Program/input/dprintf + ' returned non-zero exit status 1. +Extract_Functions /root/Program/input/dprintf-> Command '/root/idapro-9.0/idat64 -A -B -S"interface_extract.py" /root/Program/input/dprintf + ' returned non-zero exit status 1. diff --git a/src/output/dprintf_extract/patch_dprintf.json b/src/output/dprintf_extract/patch_dprintf.json new file mode 100644 index 0000000..ed7416a --- /dev/null +++ b/src/output/dprintf_extract/patch_dprintf.json @@ -0,0 +1,46 @@ +[ + { + "file_path": "/root/LLM_prompt/output//dprintf_extract/patch_dprintf.json", + "vul_info": " there is a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer is being passed as the format string to the dprintf function without proper formatting. This can potentially lead to a format string vulnerability." + }, + { + "file_path": "dprintf_extract.c", + "vul_info": " there is a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer is being passed as the format string to dprintf without proper formatting. This can potentially lead to a format string vulnerability." + }, + { + "file_path": "dprintf_extract.c", + "vul_info": " there is a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer is passed as the format string to the dprintf function without proper formatting. This can potentially lead to a format string vulnerability." + }, + { + "file_path": "dprintf_extract.c", + "vul_info": " there is a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer is being passed as the format string to dprintf without proper formatting. This can potentially lead to a format string vulnerability." + }, + { + "file_path": "dprintf_extract.c", + "vul_info": " there is a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer is directly passed as the format string to the dprintf function without proper formatting. This can potentially lead to a format string vulnerability." + }, + { + "file_path": "dprintf_extract.c", + "vul_info": " there is a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer is passed as the format string to the dprintf function without proper formatting. This can lead to a format string vulnerability, allowing an attacker to potentially read or write arbitrary memory locations." + }, + { + "file_path": "dprintf_extract.c", + "vul_info": " there is a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer is passed as the format string to dprintf without proper formatting. This can potentially lead to a format string attack." + }, + { + "file_path": "dprintf_extract.c", + "vul_info": " there is a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer is being passed as the format string to the dprintf function without proper formatting. This can potentially lead to a format string vulnerability." + }, + { + "file_path": "dprintf_extract.c", + "vul_info": " there is a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer variable is directly passed as the format string to the dprintf function without any format specifier. This can potentially lead to a format string vulnerability if an attacker controls the input in the buffer variable." + }, + { + "file_path": "dprintf_extract.c", + "vul_info": " the program contains a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer variable is directly passed as the format string to the dprintf function without proper formatting. This can allow an attacker to exploit the format string vulnerability and potentially execute arbitrary code." + }, + { + "file_path": "dprintf_extract.c", + "vul_info": " the program contains a dprintf format string vulnerability in the echo_handler function. The vulnerability lies in the line `dprintf(sock, buffer)`, where the buffer is directly passed as the format string to the dprintf function without proper formatting. This can potentially lead to a format string vulnerability if an attacker can control the contents of the buffer." + } +] \ No newline at end of file diff --git a/src/output/dprintf_extract/patch_recv.json b/src/output/dprintf_extract/patch_recv.json new file mode 100644 index 0000000..471e2e5 --- /dev/null +++ b/src/output/dprintf_extract/patch_recv.json @@ -0,0 +1,80 @@ +[ + { + "file_name": "dprintf_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer before writing data to it. The buffer size is 256 bytes, but the recv function is writing up to 0x100 bytes (256 bytes) to the buffer, which can lead to a buffer overflow vulnerability.", + "fix_size": 248, + "patch_info": "In the echo_handler function, the buffer size is 256 bytes, but only 248 bytes are being used for the recv function (starting from buffer[8]). This leaves 8 bytes unused, which could potentially lead to a buffer overflow if the recv function receives more than 248 bytes of data. To ensure the program works safely, the recv function should be prepared to receive a maximum of 248 bytes of data." + }, + { + "file_name": "dprintf_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer before writing data to it. This can lead to a buffer overflow vulnerability if the data received is larger than the size of the buffer (256 bytes). An attacker could potentially exploit this vulnerability to overwrite memory beyond the buffer and execute arbitrary code.", + "fix_size": 248, + "patch_info": "In the echo_handler function, the buffer size is 256 bytes. However, only 248 bytes are being used for the recv function (buffer[8] to buffer[255]). This leaves 8 bytes at the beginning of the buffer unused, which could potentially lead to a buffer overflow if the recv function receives more than 248 bytes of data." + }, + { + "file_name": "dprintf_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer being used. It receives data into the buffer starting from index 8, which could potentially lead to a buffer overflow if the received data is larger than the allocated buffer size.", + "fix_size": 248, + "patch_info": "The buffer size should be 248 bytes to account for the 8 bytes offset in the buffer index (&buffer[8]) in the recv function call. This will prevent buffer overflow and ensure the program works safely." + }, + { + "file_name": "dprintf_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer being passed to it. It receives data into the buffer starting from index 8, which could potentially lead to a buffer overflow if more data than the allocated buffer size is received.", + "fix_size": 248, + "patch_info": "The buffer size should be 248 bytes to account for the 8 bytes offset in the buffer array. This will prevent buffer overflow when using recv." + }, + { + "file_name": "dprintf_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer being passed to it, which can lead to a buffer overflow if the data received is larger than the buffer size of 256 bytes. This can potentially overwrite adjacent memory locations and lead to security vulnerabilities.", + "fix_size": 255, + "patch_info": "The buffer size should be set to 255 to ensure that there is enough space for the received data and to prevent buffer overflow. The buffer size is set to 256 in the code, but since strings in C are null-terminated, the last byte should be reserved for the null terminator." + }, + { + "file_name": "dprintf_extract.c", + "vul_info": " reason: The recv function in the echo_handler function reads up to 256 bytes into the buffer array, which is only 256 bytes in size. If more than 256 bytes are received, a buffer overflow could occur, leading to potential security vulnerabilities.", + "fix_size": 255, + "patch_info": "The buffer size should be set to 255 to ensure that there is enough space for the received data and to prevent buffer overflow. The buffer size is set to 256 in the code, but since strings in C are null-terminated, the last byte should be reserved for the null terminator." + }, + { + "file_name": "dprintf_extract.c", + "vul_info": " reason: The recv function in the echo_handler function reads data into the buffer array without checking the size of the data being received. This can lead to a buffer overflow if the data received is larger than the size of the buffer (256 bytes).", + "fix_size": 255, + "patch_info": "The buffer size should be set to 255 to ensure that there is enough space for the received data and to prevent buffer overflow. The buffer size is set to 256 in the code, but since strings in C are null-terminated, the last byte should be reserved for the null terminator." + }, + { + "file_name": "dprintf_extract.c", + "vul_info": " the program contains a risk of buffer overflow in the recv function. \n\nThe recv function is called with the buffer array as the second argument and a size of 0x100uLL (256 in decimal) as the third argument. However, the buffer array is only 256 bytes in size, which means that if more than 256 bytes are received from the socket, a buffer overflow could occur.\n\nTo mitigate this risk, the size of the buffer should be increased to accommodate the maximum amount of data that could be received from the socket.", + "fix_size": 255, + "patch_info": "The buffer size is declared as 256 bytes, so the maximum size for recv should be 255 to prevent buffer overflow. This leaves one byte for the null terminator." + }, + { + "file_name": "dprintf_extract.c", + "vul_info": " reason: The recv function in the echo_handler function reads up to 256 bytes into the buffer variable, which is only allocated 256 bytes of space. This means that if more than 256 bytes are received, a buffer overflow could occur.", + "fix_size": 255, + "patch_info": "The buffer size should be set to 255 to account for the null terminator at the end of the buffer. This ensures that there is enough space to store the received data without causing a buffer overflow." + }, + { + "file_name": "dprintf_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the input buffer before reading data into it, which can lead to a buffer overflow vulnerability. The buffer size is defined as 256 bytes, but the recv function reads up to 0x100 bytes (256 bytes) into the buffer without checking if the input data exceeds the buffer size. This can potentially overwrite adjacent memory locations and lead to a buffer overflow.", + "fix_size": 255, + "patch_info": "The buffer size should be set to 255 to ensure that there is enough space to store the received data from the socket without causing a buffer overflow. The buffer size of 256 in the code snippet leaves only 1 byte for the null terminator, which may not be sufficient to prevent buffer overflow." + }, + { + "file_name": "dprintf_extract.c", + "vul_info": " the program contains the risk of buffer overflow in the recv function. The recv function is used to receive data from a socket into the buffer array, but the size of the buffer is fixed at 256 bytes. If the data received from the socket is larger than 256 bytes, it can lead to a buffer overflow vulnerability.", + "fix_size": 255, + "patch_info": "The buffer size in the echo_handler function is 256 bytes, so the maximum size for recv should be 255 bytes to prevent buffer overflow. This leaves one byte for the null terminator." + }, + { + "file_name": "dprintf_extract.c", + "vul_info": " reason: The recv function in the echo_handler function reads up to 256 bytes into the buffer array, which is only allocated 256 bytes. This means that if more than 256 bytes are received, a buffer overflow can occur.", + "fix_size": 255, + "patch_info": "The buffer size should be set to 255 to ensure that there is enough space for the received data as recv function reads up to the specified size - 1 bytes and adds a null terminator at the end. This prevents buffer overflow and ensures the program works safely." + }, + { + "file_name": "dprintf_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer being passed to it, which can lead to a buffer overflow if the data received is larger than the buffer size of 256 bytes.", + "fix_size": 255, + "patch_info": "The buffer size should be set to 255 to ensure that there is enough space to store the received data without causing a buffer overflow. The buffer size is set to 256 in the code, but since strings in C are null-terminated, only 255 characters can be safely stored in the buffer to prevent overflow." + } +] \ No newline at end of file diff --git a/src/output/edit_extract/patch_strcpy.json b/src/output/edit_extract/patch_strcpy.json new file mode 100644 index 0000000..189e2c1 --- /dev/null +++ b/src/output/edit_extract/patch_strcpy.json @@ -0,0 +1,68 @@ +[ + { + "file_name": "edit_extract.c", + "vul_info": " strcpy used in the add function poses a risk of buffer overflow. The strcpy function is copying the input string 'str' into the 'data' field of the 'Node' structure without checking the length of the input string. This can lead to a buffer overflow if the input string is larger than the allocated size of 'data' in the 'Node' structure.", + "fix_size": 0, + "patch_info": "The size should be set to 0x107 because the Node struct contains a data field of size 0x108, and strncpy should only copy up to the specified size minus 1 to ensure that the null terminator is included." + }, + { + "file_name": "edit_extract.c", + "vul_info": " there is a strcpy vulnerability in the code. The strcpy function is used in the 'add' and 'edit' functions without checking the length of the input string 'str' against the size of the destination buffer 'newNode->data'. This can lead to buffer overflow if the input string is larger than the size of the destination buffer.", + "fix_size": 4131, + "patch_info": "The size of strncpy should be set to 1023 because the maximum length of the input string in the add function is 1023 characters. This ensures that the strncpy function does not exceed the allocated memory for the data field in the Node structure." + }, + { + "file_name": "edit_extract.c", + "vul_info": " strcpy used in the add function poses a risk of buffer overflow. The strcpy function is copying the input string 'str' into the 'data' field of the 'newNode' structure without checking the length of the input string. This can lead to a buffer overflow if the input string is larger than the allocated memory for 'data' in the 'newNode' structure.", + "fix_size": 598, + "patch_info": "The size of strncpy should be set to 256 because the maximum length of the data in the Node struct is 256 bytes (0x100uLL). This ensures that the strncpy function does not exceed the allocated memory for the data field in the Node struct." + }, + { + "file_name": "edit_extract.c", + "vul_info": " there is a strcpy vulnerability in the code. The strcpy function is used in the 'add' function without checking the length of the input string 'str' before copying it into 'newNode->data'. This can lead to a buffer overflow if the input string is larger than the allocated memory for 'newNode->data'.", + "fix_size": 256, + "patch_info": "Reason: The maximum length of the data field in the Node struct is 256 bytes (0x100uLL), so the size for strncpy should be set to 256 to ensure that the data is properly copied without exceeding the allocated memory space." + }, + { + "file_name": "edit_extract.c", + "vul_info": " there is a strcpy vulnerability in the code. The strcpy function is used in the 'add' and 'edit' functions without checking the length of the input string 'str' against the size of the destination buffer 'newNode->data'. This can lead to buffer overflow if the input string is larger than the destination buffer size.", + "fix_size": 256, + "patch_info": "The maximum size of the data field in the Node struct is 256 bytes (0x100uLL), so the strncpy should be set to this size to ensure that the data is not truncated or overwritten." + }, + { + "file_name": "edit_extract.c", + "vul_info": " there is a strcpy vulnerability in the code. The strcpy function used in the 'add' function can potentially lead to a buffer overflow if the input string 'str' is larger than the allocated size of 'newNode->data'. This can result in overwriting adjacent memory locations and potentially lead to a security vulnerability.", + "fix_size": 256, + "patch_info": "The size for strncpy should be set to 256 because the maximum length of the data field in the Node struct is 256 bytes (0x100uLL). Using strncpy with a size of 256 ensures that the data is copied correctly without exceeding the allocated memory for the data field in the Node struct." + }, + { + "file_name": "edit_extract.c", + "vul_info": " there is a strcpy vulnerability in the code. The strcpy function is used in the \"add\" function without checking the length of the input string 'str' before copying it into the 'data' field of the 'newNode' struct. This can lead to a buffer overflow if the input string is larger than the allocated memory for 'data'.", + "fix_size": 0, + "patch_info": "The size should be set to 0x107 because the data field in the Node struct is of size 0x108, and strncpy should not copy the null terminator. Therefore, setting the size to 0x107 ensures that the entire data field is copied without including the null terminator." + }, + { + "file_name": "edit_extract.c", + "vul_info": " there is a strcpy vulnerability in the code. The strcpy function is used in the \"add\" function to copy the input string into the \"data\" field of the Node struct without checking the length of the input string. This can lead to a buffer overflow if the input string is longer than the allocated space for the \"data\" field.", + "fix_size": 1023, + "patch_info": "The size of strncpy should be set to 1023 because the maximum length of the input string 'arg1' in the main function is 1023 characters. This ensures that the strncpy function does not exceed the allocated buffer size and prevents buffer overflow vulnerabilities." + }, + { + "file_name": "edit_extract.c", + "vul_info": " strcpy used in the add function poses a risk of buffer overflow. The strcpy function is copying the input string 'str' into the 'data' field of the 'newNode' struct without checking the length of the input string. This can lead to a buffer overflow if the input string is larger than the allocated memory for 'data' in the 'newNode' struct.", + "fix_size": 0, + "patch_info": "The size should be set to 0x107(decimal) for strncpy in order to replace strcpy. This is because the size of the data field in the Node struct is 0x108uLL, and strncpy should copy up to one less byte than the total size of the data field to prevent buffer overflow." + }, + { + "file_name": "edit_extract.c", + "vul_info": " there is a strcpy vulnerability in the code. The strcpy function is used in the \"add\" function without checking the length of the input string \"str\" before copying it into the \"data\" field of the \"newNode\" struct. This can lead to a buffer overflow if the input string is larger than the allocated memory for \"data\".", + "fix_size": 1023, + "patch_info": "The maximum length of the string that can be passed to the add function is 1023 characters based on the buffer size of arg1 in the main function. Therefore, the size for strncpy should be set to 1023 to ensure that the entire string is copied without exceeding the buffer size." + }, + { + "file_name": "edit_extract.c", + "vul_info": " there is a strcpy vulnerability in the code. The strcpy function is used in the \"add\" function without checking the length of the input string \"str\" before copying it into the \"newNode->data\" buffer. This can lead to a buffer overflow if the input string is longer than the buffer size allocated for \"newNode->data\".", + "fix_size": 1023, + "patch_info": "The maximum size of the input string for the add function is 1023 characters, so the size for strncpy should be set to 1023 to ensure that the entire input string is copied without exceeding the buffer size." + } +] \ No newline at end of file diff --git a/src/output/recv_extract/patch_recv.json b/src/output/recv_extract/patch_recv.json new file mode 100644 index 0000000..538911e --- /dev/null +++ b/src/output/recv_extract/patch_recv.json @@ -0,0 +1,44 @@ +[ + { + "file_name": "recv_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer before writing data to it, which can lead to a buffer overflow vulnerability. The buffer size is 256 bytes, but the recv function is writing data starting from buffer[8], potentially allowing for more data to be written than the buffer can hold.", + "fix_size": 256, + "patch_info": "In the echo_handler function, the buffer size is set to 256 bytes. Therefore, when using recv to receive data from the socket, the program should be prepared to handle up to 256 bytes of data to prevent buffer overflow." + }, + { + "file_name": "recv_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer being passed to it. It receives data into the buffer starting from index 8, which could potentially lead to a buffer overflow if the received data is larger than the allocated buffer size.", + "fix_size": 256, + "patch_info": "In the echo_handler function, the buffer size is set to 256 bytes. Therefore, when using recv to receive data from the socket, the program should be prepared to handle up to 256 bytes of data to prevent buffer overflow." + }, + { + "file_name": "recv_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer before copying data into it, which can lead to a buffer overflow vulnerability. The buffer size is 256 bytes, but the recv function is copying data into buffer starting from index 8, potentially allowing more data to be copied than the buffer can hold.", + "fix_size": 256, + "patch_info": "In the echo_handler function, the buffer size is set to 256 bytes. Therefore, when using recv to receive data from the socket, the program should be prepared to handle up to 256 bytes of data to avoid buffer overflow." + }, + { + "file_name": "recv_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer before copying data into it. This can lead to a buffer overflow vulnerability if the data received is larger than the size of the buffer (256 bytes). An attacker could potentially exploit this vulnerability to overwrite memory beyond the buffer and execute malicious code.", + "fix_size": 248, + "patch_info": "The buffer size should be reduced by 8 to account for the offset used in recv to prevent buffer overflow." + }, + { + "file_name": "recv_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer before copying data into it, which can lead to a buffer overflow vulnerability. The buffer size is 256 bytes, but the recv function is copying up to 0x400 bytes into the buffer starting from index 8, potentially overwriting memory beyond the buffer boundaries.", + "fix_size": 248, + "patch_info": "The buffer size should be reduced by 8 bytes to account for the offset of 8 in the recv function call. This will prevent buffer overflow and ensure the program works safely." + }, + { + "file_name": "recv_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer being passed to it, which can lead to a buffer overflow vulnerability if the data received is larger than the buffer size of 256 bytes.", + "fix_size": 255, + "patch_info": "The buffer size should be set to 255 to ensure that there is enough space to store the received data from the client without causing a buffer overflow. The buffer size should always be one less than the actual size to account for the null terminator." + }, + { + "file_name": "recv_extract.c", + "vul_info": " the program contains a risk of buffer overflow in the recv function. The recv function is called with a buffer size of 0x400 (1024 bytes), but the buffer allocated in the echo_handler function is only 256 bytes. This means that if the recv function receives more than 256 bytes of data, it will overflow the buffer and potentially overwrite other memory areas.", + "fix_size": 255, + "patch_info": "The buffer size should be set to 255 to ensure that there is enough space for the received data plus a null terminator. This will prevent buffer overflow and ensure the program works safely." + } +] \ No newline at end of file diff --git a/src/output/recv_extract/recv b/src/output/recv_extract/recv new file mode 100644 index 0000000..9e00fc0 --- /dev/null +++ b/src/output/recv_extract/recv @@ -0,0 +1,8 @@ +[ + { + "file_name": "recv_extract.c", + "vul_info": " reason: The recv function in the echo_handler function does not check the size of the buffer before writing data to it, which can lead to a buffer overflow vulnerability. The buffer size is 256 bytes, but the recv function is writing data starting from buffer[8], potentially allowing for more data to be written than the buffer can hold.", + "fix_size": 248, + "patch_info": "The buffer size should be reduced by 8 bytes to account for the offset used in recv function (&buffer[8]). This will prevent buffer overflow and ensure the program works safely." + } +] \ No newline at end of file diff --git a/src/prompt.json b/src/prompt.json new file mode 100644 index 0000000..174cc70 --- /dev/null +++ b/src/prompt.json @@ -0,0 +1,50 @@ +[ + { + "type": "attack", + "name": "dprintf", + "prompt": { + "role": "user", + "content": "Please analyze whether the following program contains a dprintf format string vulnerability. If you find dprintf format string vulnerability please answer with 'yes, reason here'.\n{code}" + } + }, + { + "type": "attack", + "name": "strcpy", + "prompt": { + "role": "user", + "content": "Please analyze the following code to determine if the strcpy used in the program poses a risk of buffer overflow. If it actually exists then answer with 'yes, reason here', or else output 'no strcpy vulnerability'.\n{code}" + } + }, + { + "type": "struct", + "name": "strcpy", + "prompt": { + "role": "user", + "content": "Here are some specific struct information that may be useful for my later questions. It should be noted that the pointer next size is 8 bytes.\n{struct_data}" + } + }, + { + "type": "patch", + "name": "strcpy", + "prompt": { + "role": "user", + "content": "According to struct Node info determine how many size should I set for strncpy which will be used to replace strcpy and only consider add function. Answer with 'size=value(decimal), ', and then give me the reason.\n{code}" + } + }, + { + "type": "attack", + "name": "recv", + "prompt": { + "role": "user", + "content": "Please analyze whether the following program contains the risk of buffer overflow and only check recv function. If it actually exists then answer with 'yes, reason here', or else output 'no recv vulnerability'.\n{code}" + } + }, + { + "type": "patch", + "name": "recv", + "prompt": { + "role": "user", + "content": "There is a risk of buffer overflow when using recv in the program. Please tell me the specific size be prepared for recv to ensure the program work safely. Answer with 'size=value, ', and then give me the reason.\n{code}" + } + } +] \ No newline at end of file diff --git a/src/prompt.py b/src/prompt.py new file mode 100644 index 0000000..6c83c3a --- /dev/null +++ b/src/prompt.py @@ -0,0 +1,69 @@ +""" +This script is designed for editing the bare query + +bare query - questions or information that inspire +ChatGPT to understand the program deeply instead of +caring about the response of ChatGPT + +{ + 'type': 'bare_query', + 'name': 'XXX', + 'prompt': { + 'role': 'user', + 'content': 'You should provide programming advice.', + } +} +""" + +import os +import json + + +BPATH = os.path.dirname(os.path.abspath(__file__)) +BPATH = os.path.join(BPATH, 'prompt.json') +print(BPATH) +assert(os.path.exists(BPATH)) + +with open(BPATH, 'r') as r: + lst = json.load(r) + +while True: + choice = input('1. list 2. add new 3. keyword-based search 4. delete 5. exit: ') + if choice == '1': + print('\n-----------------') + for _id, _query in enumerate(lst): + _type = _query['type'] + _name = _type + if 'name' in _query.keys(): + _name = _query['name'] + print(_id, f': ({_type}) ({_name})', repr(_query['prompt']['content'])) + elif choice == '2': + _type = input('Input your query type:') + _name = input('Input your query name (use type as default):') + if not _name: + _name = _typeprompt + _query = input('Input your query content:') + new_entry = { + 'type': _type, + 'name': _name, + 'prompt': { + 'role': 'user', + 'content': _query, + } + } + lst.append(new_entry) + elif choice == '3': + k = input('Input your keyword:') + for _id, _query in enumerate(lst): + _c = _query['prompt']['content'] + if k in _c: + print(_id, ':', _c) + elif choice == '4': + i = input('Input the id of deleted enetry:') + lst.pop(int(i)) + elif choice == '5': + with open(BPATH, 'w') as w: + json.dump(lst, w, indent=4) + exit(0) + else: + pass diff --git a/src/tmp.txt b/src/tmp.txt new file mode 100644 index 0000000..d3d8ebb --- /dev/null +++ b/src/tmp.txt @@ -0,0 +1 @@ +/root/Program/input/dprintf \ No newline at end of file