-0x01 - рдЗрдВрдЯреНрд░реЛ
рдпрд╣ рд▓реЗрдЦ рдлреНрд▓реЗрдпреЗрд░-рдСрди 2019 рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ - рдлрд╛рдпрд░рдИ рд╕реЗ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡рд╛рд░реНрд╖рд┐рдХ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ред рдЗрди рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ, рдореИрдВ рджреВрд╕рд░реА рдмрд╛рд░ рднрд╛рдЧ рд▓реЗрддрд╛ рд╣реВрдВред рдкрд┐рдЫрд▓реЗ рд╡рд░реНрд╖ рдореЗрдВ, рдореИрдВрдиреЗ рд▓рдЧрднрдЧ 13 рджрд┐рдиреЛрдВ рдореЗрдВ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдордп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ 11 рд╡рд╛рдВ рд╕реНрдерд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдмреА рд╣рд╛рд╕рд┐рд▓ рдХреАред рдЗрд╕ рд╕рд╛рд▓, рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕реЗрдЯ рдЖрд╕рд╛рди рдерд╛, рдФрд░ рдореИрдВ 54 рдШрдВрдЯреЛрдВ рдореЗрдВ рдорд┐рд▓рд╛, рдЙрд╕реА рд╕рдордп рдбрд┐рд▓реАрд╡рд░реА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ 3 рд╕реНрдерд╛рди рдкрд░ рд░рд╣рд╛ред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рдЙрди рдХреНрд╖рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд┐рдирд╕реЗ рдореЗрд░реА рд╕рдмрд╕реЗ рдмрдбрд╝реА рд░реБрдЪрд┐ рдкреИрджрд╛ рд╣реБрдИ, рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдИрдбреАрдП рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рджрд┐рдирдЪрд░реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╕рдордЭрдирд╛ рдФрд░ рдЕрдиреНрдп рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рдирд╣реАрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдП рдХреБрдЫ рдирдпрд╛ рдФрд░ рдЙрдкрдпреЛрдЧреА рдкрд╛рдПрдВрдЧреЗред рдЖрдк рд▓реЗрдЦрдХреЛрдВ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╡рд┐рдЬреЗрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЖрдВрдХрдбрд╝реЗ рдФрд░ рдкреБрд░рд╕реНрдХрд╛рд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред
рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
0x00 - рд╕рд╛рдордЧреНрд░реА
- 0x01 - рдореЗрдореЗрдХреНрдЯ рдмреИрдЯрд▓рд╕реНрдЯреЗрд╢рди [рд╢реЗрдпрд░рд╡реЗрдпрд░ рдбреЗрдореЛ рд╕рдВрд╕реНрдХрд░рдг]
- 0x02 - рд▓рдВрдмреЗ рд╕рдордп рддрдХ
- 0x03 - рднрдбрд╝рдХрдирд╛
- 0x04 - Dnschess
- 0x05 - рдбреЗрдореЛ
- 0x06 - рдмреАрдПрдордкреАрдб
- 0x07 - wopr
- 0x08 - рд╕рд╛рдВрдк
- 0x09 - рдкреБрдирдГ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛
- 0x0 рдП - рдореБрдЧрд╛рддреБ
- 0x0B - vv_max
- 0x0C - рдорджрдж
- 0x0D - рд╕рд╛рд░рд╛рдВрд╢
0x01 - рдореЗрдореЗрдХреНрдЯ рдмреИрдЯрд▓рд╕реНрдЯреЗрд╢рди [рд╢реЗрдпрд░рд╡реЗрдпрд░ рдбреЗрдореЛ рд╕рдВрд╕реНрдХрд░рдг]
рдЪреБрдиреМрддреА рдкрд░ рдЫрдареА рднрдбрд╝рдХ!
рдпрд╣ рдПрдХ рд╕рд░рд▓ рдЦреЗрд▓ рд╣реИред рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреЛ "рд╣рдерд┐рдпрд╛рд░ рдХреЛрдб" рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рджреЛ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдЬрдп рд╕реНрдХреНрд░реАрди рдзреНрд╡рдЬ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░реЗрдЧрд╛ред рд╕реНрдХреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рд╛рдЗрдЯ рдкрд░ рдпрд╣рд╛рдБ рдзреНрд╡рдЬ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░реЗрдВ рдФрд░ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рдкрд░ рдЬрд╛рдПрдБред
* рдпрд╣ рдЪреБрдиреМрддреА .NET рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдкрд╕рдВрджреАрджрд╛ .NET рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдЯреВрд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ dnSpy рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ
** рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдмреНрд▓реИрдХрд╣реИрдЯ рдкрд░ рд╣рдорд╛рд░реЗ рдмреВрде рдкрд░ рдЗрд╕ рдЧреЗрдо рдХреЗ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╣рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдпрд╛ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдмрдзрд╛рдИ, рдЗрд╕ рд╕реНрддрд░ рдХреЛ рдмрд╛рдИрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдм рдЬреАрдд рд╕реНрдХреНрд░реАрди рд╕реЗ рдзреНрд╡рдЬ рджрд░реНрдЬ рдХрд░реЗрдВред
рдпрд╣ рдХрд╛рд░реНрдп рдмреНрд▓реИрдХ рд╣реИрдЯ рдпреВрдПрд╕рдП 2019 рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕реА рд╕рдордп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрдм рдореИрдВрдиреЗ рдпрд╣ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдерд╛ред рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЯрд╛рд╕реНрдХ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
0x02 - рд▓рдВрдмреЗ рд╕рдордп рддрдХ
рдЗрд╕ рдЕрдЧрд▓реА рдЪреБрдиреМрддреА рдХрд╛ рд░рд╣рд╕реНрдп рдмрдбрд╝реА рдЪрддреБрд░рд╛рдИ рд╕реЗ рдЫрд┐рдкрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛ред
рджрд┐рдпрд╛ рдЧрдпрд╛ x86 .exe рдлрд╝рд╛рдЗрд▓ рдЬрдм рдЖрдк рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ:

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрджреЗрд╢ рдХреБрдЫ рд╡рд░реНрдгрдХреНрд░рдо рд▓рдВрдмрд╛рдИ (1 рд╕реЗ 4 рдмрд╛рдЗрдЯреНрд╕) рдХреЗ рд╕рд╛рде рдХреБрдЫ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдЬрдм рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреА рд▓рдВрдмрд╛рдИ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрджреЗрд╢ рд╕реЗ рд╣реА рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдЭрдВрдбрд╛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЖрдк рдбрд┐рдмрдЧ рдореЛрдб рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреА рдЧрдИ рд▓рдВрдмрд╛рдИ рдорд╛рди рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЖрдк рдкрд╛рдпрдерди рдореЗрдВ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЭрдВрдбрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
msg = [ ... ]
0x03 - рднрдбрд╝рдХрдирд╛
рд╣рдо рдлреНрд▓реЗрдпрд░ рдореЗрдВ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рддрдорд╛рдЧрд╛рдЯреЛрдЪреА рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░ рдкреИрджрд╛ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рд╡рд╣ рдмрд╣реБрдд рдЙрдзрдо рдордЪрд╛рддрд╛ рд╣реИред рдЙрд╕реЗ рдЬреАрд╡рд┐рдд рдФрд░ рдЦреБрд╢ рд░рдЦреЗрдВ рдФрд░ рд╡рд╣ рдЖрдкрдХреЛ рдЭрдВрдбрд╛ рджреЗрдЧрд╛ред
рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ, Android
рд▓рд┐рдП рдПрдХ apk
рдлрд╝рд╛рдЗрд▓ Android
ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдкрд╣рд▓рд╛ рдЪрд░рдг рдЖрд╡реЗрджрди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, dex2jar
рдпреВрдЯрд┐рд▓рд┐рдЯреА dex2jar
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, dex2jar
рдХреЛ jar
рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдбрд┐рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Java
рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рдореИрдВ cfr
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
~/retools/d2j/d2j-dex2jar.sh flarebear.apk java -jar ~/retools/cfr/cfr-0.146.jar --outputdir src flarebear-dex2jar.jar
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ, рдЖрдк рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк .danceWithFlag()
рд╡рд┐рдзрд┐ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ FlareBearActivity.java
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред .danceWithFlag()
рдЕрдВрджрд░, raw
рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ .decrypt(String, byte[])
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ .getPassword()
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдзреНрд╡рдЬ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдбрд┐рдХрдореНрдкреЛрдЬреНрдб рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ, Android
рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдФрд░ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ .getPassword()
рд╡рд┐рдзрд┐ рддреАрди рдкреВрд░реНрдгрд╛рдВрдХ рд░рд╛рдЬреНрдп рдорд╛рдиреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди 0
рд╕реЗ N
рддрдХ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рдкрд╛рд╕рд╡рд░реНрдб рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдЧреБрдЬрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реИ:
Main.java import java.io.InputStream; import java.nio.charset.Charset; import java.security.Key; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.KeySpec; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; import java.util.Collections; import java.io.*; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.SecretKeySpec; public final class Main { public static void main (String args []) throws Exception { Main a = new Main(); InputStream inputStream = new FileInputStream("ecstatic"); long fileSize = new File("ecstatic").length(); byte[] file1 = new byte[(int) fileSize]; inputStream.read(file1); inputStream = new FileInputStream("ecstatic2"); fileSize = new File("ecstatic2").length(); byte[] file2 = new byte[(int) fileSize]; inputStream.read(file2); for(int i = 0; i < 9; i++) { for(int j = 0; j < 7; j++) { for(int k = 1; k < 16; k++) { String pass = a.getPassword(i, j, k); try { byte[] out1 = a.decrypt(pass, file1); byte[] out2 = a.decrypt(pass, file2); OutputStream outputStream = new FileOutputStream("out1"); outputStream.write(out1); outputStream = new FileOutputStream("out2"); outputStream.write(out2); System.out.println("yep!"); } catch (javax.crypto.BadPaddingException ex) { } } } } } public final byte[] decrypt(Object object, byte[] arrby) throws Exception { Object object2 = Charset.forName("UTF-8"); object2 = "pawsitive_vibes!".getBytes((Charset)object2); object2 = new IvParameterSpec((byte[])object2); object = ((String)object).toCharArray(); Object object3 = Charset.forName("UTF-8"); object3 = "NaClNaClNaCl".getBytes((Charset)object3); object = new PBEKeySpec((char[])object, (byte[])object3, 1234, 256); object = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret((KeySpec)object); object3 = new SecretKeySpec(((SecretKey)object).getEncoded(), "AES"); object = Cipher.getInstance("AES/CBC/PKCS5Padding"); ((Cipher)object).init(2, (Key)object3, (AlgorithmParameterSpec)object2); object = ((Cipher)object).doFinal(arrby); return (byte [])object; } public final String getPassword(int n, int n2, int n3) { String string2 = "*"; String string3 = "*"; switch (n % 9) { case 8: { string2 = "*"; break; } case 7: { string2 = "&"; break; } case 6: { string2 = "@"; break; } case 5: { string2 = "#"; break; } case 4: { string2 = "!"; break; } case 3: { string2 = "+"; break; } case 2: { string2 = "$"; break; } case 1: { string2 = "-"; break; } case 0: { string2 = "_"; } } switch (n3 % 7) { case 6: { string3 = "@"; break; } case 4: { string3 = "&"; break; } case 3: { string3 = "#"; break; } case 2: { string3 = "+"; break; } case 1: { string3 = "_"; break; } case 0: { string3 = "$"; } case 5: } String string4 = String.join("", Collections.nCopies(n / n3, "flare")); String string5 = String.join("", Collections.nCopies(n2 * 2, this.rotN("bear", n * n2))); String string6 = String.join("", Collections.nCopies(n3, "yeah")); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(string4); stringBuilder.append(string2); stringBuilder.append(string5); stringBuilder.append(string3); stringBuilder.append(string6); return stringBuilder.toString(); } public final String rotN(String charSequence, int n) { Collection<String> collection = new ArrayList(charSequence.length()); for (int i = 0; i < charSequence.length(); ++i) { char c; char c2 = c = charSequence.charAt(i); if (Character.isLowerCase(c)) { char c3; c2 = c3 = (char)(c + n); if (c3 > 'z') { c2 = c3 = (char)(c3 - n * 2); } } collection.add(Character.valueOf(c2).toString()); } return collection.stream().collect(Collectors.joining());
рд╣рдо рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдлрд╛рдЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЪрд▓рд╛рдПрдВрдЧреЗ:
$ ~/retools/apktool/apktool d flarebear.apk $ cp flarebear/res/raw/* . $ javac Main.java $ java Main
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рд╕рднреА рдкрд╛рд╕рд╡рд░реНрдб рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдПрдХ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рджреЛ рдЪрд┐рддреНрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ:
~/flareon2019/3 - Flarebear$ file out* out1: PNG image data, 2100 x 2310, 8-bit/color RGB, non-interlaced out2: PNG image data, 2100 x 2310, 8-bit/color RGB, non-interlaced


0x04 - Dnschess
рдХреБрдЫ рд╕рдВрджрд┐рдЧреНрдз рдиреЗрдЯрд╡рд░реНрдХ рдЯреНрд░реИрдлрд╝рд┐рдХ рдиреЗ рд╣рдореЗрдВ рдЙрдмрдВрдЯреВ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдЪрд▓ рд░рд╣реЗ рдЗрд╕ рдЕрдирдзрд┐рдХреГрдд рд╢рддрд░рдВрдЬ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред рдпрд╣ рд╕рд╛рдЗрдмрд░рд╕реНрдкреЗрд╕ рдХрдВрдкреНрдпреВрдЯрд░ рд╣реИрдХрд░реНрд╕ рдХрд╛ рдХрд╛рдо рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЪрд╛рд▓ рдЪрд▓рдиреА рд╣реЛрдЧреАред рдЕ рдЫрд╛!
рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдПрдХ рдЯреНрд░реИрдлрд╝рд┐рдХ рдбрдВрдк, рдПрдХ ELF
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ ChessUI
рдФрд░ рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА ChessAI.so
ред рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рдХрд░, рдЖрдк рд╢рддрд░рдВрдЬрдмреЛрд░реНрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЪрд▓реЛ рдПрдХ рдпрд╛рддрд╛рдпрд╛рдд рдбрдВрдк рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╕рднреА рдЯреНрд░реИрдлрд╝рд┐рдХ рдореЗрдВ рдЯрд╛рдЗрдк A
DNS
рд╕рд░реНрд╡рд░ рдХреЗ рдкреНрд░рд╢реНрди рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рдЦреБрдж рдХреЛ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдирд╛рдо, рд╢рддрд░рдВрдЬ рдХреЗ рдЦреЗрд▓ рдореЗрдВ рдЪрд╛рд▓ рдХрд╛ рд╡рд░реНрдгрди рдФрд░ .game-of-thrones.flare-on.com
рдХрд╛ рдирд┐рд░рдВрддрд░ рднрд╛рдЧ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП rook-c3-c6.game-of-thrones.flare-on.com
ред рдирд┐рд░рдВрддрд░ рднрд╛рдЧ рджреНрд╡рд╛рд░рд╛, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ ChessAI.so
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕рд╣реА рдЬрдЧрд╣ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
signed __int64 __fastcall getNextMove(int idx, const char *chess_name, unsigned int pos_from, unsigned int pos_to, \__int64 a5) { struct hostent *v9;
рдпрд╣ рдЙрд╕ рдХреЛрдб рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рд╛рдкреНрдд ip
рдкрддреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ flag
рдХрд╣рд╛ flag
ред
рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЯреНрд░реИрдлрд╝рд┐рдХ рдбрдВрдк рд╕реЗ рд╕рднреА ip
рдкрддреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдЖрдк рдирд┐рдореНрди рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
tshark -r capture.pcap | grep -P -o '127.(\d+).(\d+).(\d+)' | grep -v '127.0.0.1'
рд╕рднреА ip
рдкрддреЗ рдХреЛ ips
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ ips
, ips
рдзреНрд╡рдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди Python
рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ ips
рд╕рдХрддреЗ рд╣реИрдВ:
with open('ips') as f: ips = f.read().split() flag = bytearray(64) key = b'yZ\xb8\xbc\xec\xd3\xdf\xdd\x99\xa5\xb6\xac\x156\x85\x8d\t\x08wRMqT}\xa7\xa7\x08\x16\xfd\xd7' for ip in ips: a, b, c, d = map(int, ip.split('.')) if d & 1: continue idx = c & 0xf if idx > 14: continue flag[2*idx] = b ^ key[2*idx] flag[2*idx + 1] = b ^ key[2*idx + 1] print(flag.decode() + '@flare-on.com')
0x05 - рдбреЗрдореЛ
рдлреНрд▓реЗрдпрд░ рдЯреАрдо рдХреЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдЕрдкрдиреЗ рдбреЗрдореЛрд╕рд┐рди рдХреМрд╢рд▓ рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдпрд╣ рдЦрд╛рд▓реА рд▓рдЧрддрд╛ рд╣реИред рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдлрд╛рдпрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХреЛрдИ рджрдмрд╛рд╡ рдирд╣реАрдВред
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ 4k.exe
рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЬреЛ DirectX
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЬрдм рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдореЗрдВ рдШреВрд░реНрдгрди FlareOn
рд▓реЛрдЧреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдПрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИред рд╕рд╛рдордЧреНрд░реА рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдмрд╕ ret
рдЕрдиреБрджреЗрд╢ рдкрд░ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдбрд╛рд▓реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рдХрд╣рд╛рдБ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реМрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо 0x00420000
рдХреЛ 0x00420000
рдкрддреЗ рдкрд░ рдкрд╛рддреЗ 0x00420000
, рдЬрд┐рд╕ рдкрд░ рдХреЛрдб рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рддрдм рдЗрд╕ рдХреЛрдб рдХреЛ рдбрд┐рдмрдЧ рдореЛрдб рд╕реЗ API
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ IDA
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирдпрд╛ рдХреЛрдб рд╡рд┐рднрд┐рдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЧрддрд┐рдХреА рдореЗрдВ рднреА рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯ рд╣реИ:

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛:

рдиреЛрдЯ: IDirect3DDevice9 **
рдкреНрд░рдХрд╛рд░ рдХреЗ IDirect3DDevice9 **
рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд░рд┐рд╡рд░реНрд╕ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдвреВрдВрдврдирд╛ рд╕рдВрднрд╡ рдерд╛, рдпрд╣рд╛рдВ ред рдореИрдВрдиреЗ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ IDA
рд▓рд┐рдП рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред рдбрд┐рд╡рд╛рдЗрд╕рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрдЧреЗ рдХреЗ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрди рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рджреГрд╢реНрдп рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЪрдХреНрд░ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдбрд┐рдХрдореНрдкрд╛рдЗрд▓рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред


рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░, рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рджреЛ рдмрд╣реБрднреБрдЬ рдореЗрд╖ (рдореЗрд╖, рдмрд╣реБрднреБрдЬ рдЬрд╛рд▓) рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рджреЗрдЦрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдЧреНрд░рд┐рдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЙрдирдХреЗ рдХреЛрдиреЗ XOR
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрджреЗрд╣ рднреА рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рд╡рд┐рд░реВрдкрддрд╛рдУрдВ рдХреЛ рд╕рдордЭрдиреЗ рдФрд░ рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред рджреВрд╕рд░рд╛ рдЧреНрд░рд┐рдб рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рджрд┐рд▓рдЪрд╕реНрдкреА рдХрд╛ рд╣реИ рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рдЕрдзрд┐рдХ рдХреЛрдиреЗ рд╣реИрдВред рд╕рднреА matplotlib
, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ Z
рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ 0 рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП matplotlib
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЛ-рдЖрдпрд╛рдореА рдЧреНрд░рд╛рдлрд╝ рдЦреАрдВрдЪрдирд╛ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдФрд░ рдкрд░рд┐рдгрд╛рдо рдирд┐рдХрд▓рд╛:
import struct import matplotlib.pyplot as plt with open('vertexes', 'rb') as f: data = f.read() n = len(data) // 4 data = list(struct.unpack('{}I'.format(n), data)) key = [0xCB343C8, 0x867B81F0, 0x84AF72C3] data = [data[i] ^ key[i % 3] for i in range(len(data))] data = struct.pack('{}I'.format(n), *data) data = list(struct.unpack('{}f'.format(n), data)) x = data[0::3] y = data[1::3] z = data[2::3] print(z) plt.plot(x, y) plt.show()

0x06 - рдмреАрдПрдордкреАрдб
рдЯрд╛рдпрд▓рд░ рдбреАрди рдиреЗ рдорд╛рдЙрдВрдЯ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ред рдЗрд╕ рддрд╕реНрд╡реАрд░ рдХреЛ рд╕рд╣реА рд╕рдордп рдкрд░ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 рдмрдЬреЗ рдПрд▓реНрдмрд░реНрдЯ (рдХреЛрд▓реЛрд░рд╛рдбреЛ рдХрд╛ рд╕рдмрд╕реЗ рд▓рдВрдмрд╛ рдкрд╣рд╛рдбрд╝)ред рд▓реЗрдЧ рд╕реНрдХрд┐рдк рдХреЛ рдХрднреА рди рдЫреЛрдбрд╝реЗрдВред рд╣рдордиреЗ рдпрд╣ рдЪрд┐рддреНрд░ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдкрд╛рдпрд╛ рдПрдХ рдирд┐рд╢рд╛рди рдбреНрд░рд╛рдЗрд╡ рдкрд░ рд╡рд╣ рдирд┐рд╢рд╛рди рд╕рд┐рд░ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдХреНрдпрд╛ рдЙрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдХрд╛рд░реНрдп рдореЗрдВ, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ bmphide.exe
рдФрд░ image.bmp
рдЫрд╡рд┐ image.bmp
ред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлрд╝реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐ рдореЗрдВ рдХреБрдЫ рд╕рдВрджреЗрд╢ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИред
рдмрд╛рдЗрдирд░реА C#
рдореЗрдВ рд▓рд┐рдЦрд╛ C#
, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП dnSpy
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЖрдк рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рддрд░реАрдХреЛрдВ рдХреЗ рдирд╛рдо рдореЛрдЯреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк Program.Main
рд╡рд┐рдзрд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рддрд░реНрдХ рдХреЛ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзрд╛рд░рдгрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
Program.Init()
рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡реЗрджрди рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ- рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝реЗрдВ
byte [] Program.h(byte [])
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХреБрдЫ рдбреЗрдЯрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИProgram.i(Bitmap, byte[])
рд╡рд┐рдзрд┐ Program.i(Bitmap, byte[])
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдЫрд╡рд┐ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ- рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдХреЛ рдПрдХ рдирдП рдирд╛рдо рдХреЗ рд╕рд╛рде рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди, рд╡рд┐рднрд┐рдиреНрди рдХреНрд▓рд╛рд╕ A
рддрд░реАрдХреЛрдВ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдХреНрд╖рд╛ рдХреЗ рдПрдХ рд╕рддрд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдиреЗ рдЕрдкрдиреЗ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреА рд╕рдорд╛рдирддрд╛ ConfuserEx
(рдлрд╝рд╛рдЗрд▓ AntiTamper.JIT.cs
) рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде AntiTamper.JIT.cs
ред рдЖрд╡реЗрджрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдЗрд╕реА рд╕рдордп, de4dot
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рдВрдЯреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рддрдВрддреНрд░ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред
Program.i
рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЫрд╡рд┐ рдореЗрдВ рдбреЗрдЯрд╛ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
public static void i(Bitmap bm, byte[] data) { int num = Program.j(103); for (int i = Program.j(103); i < bm.Width; i++) { for (int j = Program.j(103); j < bm.Height; j++) { bool flag = num > data.Length - Program.j(231); if (flag) { break; } Color pixel = bm.GetPixel(i, j); int red = ((int)pixel.R & Program.j(27)) | ((int)data[num] & Program.j(228)); int green = ((int)pixel.G & Program.j(27)) | (data[num] >> Program.j(230) & Program.j(228)); int blue = ((int)pixel.B & Program.j(25)) | (data[num] >> Program.j(100) & Program.j(230)); Color color = Color.FromArgb(Program.j(103), red, green, blue); bm.SetPixel(i, j, color); num += Program.j(231); } } }
рдХреНрд▓рд╛рд╕рд┐рдХ LSB
рд╕рдорд╛рди, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рдЬрд╣рд╛рдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВ, int Program.j(byte)
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд┐рднрд┐рдиреНрди рд╡реИрд╢реНрд╡рд┐рдХ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЖрд░рдВрдн рдХреЗ рджреМрд░рд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ Program.Init()
рд╡рд┐рдзрд┐ред рдпрд╣ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдХрд┐ рд╡рд╣ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рдЙрд▓реНрдЯрд╛ рди рдХрд░реЗ, рдмрд▓реНрдХрд┐ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗред dnSpy
рд╡рд┐рдШрдЯрд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ Program.Main
рд╡рд┐рдзрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
private static void Main(string[] args) { Program.Init(); Program.yy += 18; for (int i = 0; i < 256; i++) { Console.WriteLine(string.Format("j({0}) = {1}", i, Program.j((byte)i))); } }
рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореВрд▓реНрдп рдорд┐рд▓рддреЗ рд╣реИрдВ:
E:\>bmphide_j.exe j(0) = 206 j(1) = 204 j(2) = 202 j(3) = 200 j(4) = 198 j(5) = 196 j(6) = 194 j(7) = 192 j(8) = 222 j(9) = 220 j(10) = 218 j(11) = 216 j(12) = 214 j(13) = 212 j(14) = 210 j(15) = 208 j(16) = 238 j(17) = 236 j(18) = 234 j(19) = 232 j(20) = 230 ...
Program.j
рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ Program.j
рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде:
public static void i(Bitmap bm, byte[] data) { int num = 0; for (int i = 0; i < bm.Width; i++) { for (int j = 0; j < bm.Height; j++) { bool flag = num > data.Length - 1; if (flag) { break; } Color pixel = bm.GetPixel(i, j); int red = ((int)pixel.R & 0xf8) | ((int)data[num] & 0x7); int green = ((int)pixel.G & 0xf8) | (data[num] >> 3 & 0x7); int blue = ((int)pixel.B & 0xfc) | (data[num] >> 6 & 0x3); Color color = Color.FromArgb(0, red, green, blue); bm.SetPixel(i, j, color); num += 1; } } }
рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯ рдХреЛ рдЫрд╡рд┐ рдореЗрдВ рдХреИрд╕реЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП:
- рдмрд┐рдЯреНрд╕ 2 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 0 рдХреЛ рдмрд┐рдВрджреБ рдХреЗ рд▓рд╛рд▓ рдЪреИрдирд▓ рдХреЗ 3 рдПрд▓рдПрд╕рдмреА рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ
- рдмрд┐рдЯреНрд╕ 3 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 5 рдХреЛ рдмрд┐рдВрджреБ рдХреЗ рдЧреНрд░реАрди рдЪреИрдирд▓ рдХреЗ 3 рдПрд▓рдПрд╕рдмреА рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ
- рдмрд┐рдЯреНрд╕ 6 рд╕реЗ 7 рдХреЛ рдмрд┐рдВрджреБ рдХреЗ рдмреНрд▓реВ рдЪреИрдирд▓ рдХреЗ 2 рдПрд▓рдПрд╕рдмреА рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ
рдЕрдЧрд▓рд╛, рдореИрдВрдиреЗ рдбреЗрдЯрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдзрд┐ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдХреНрд▓рд╛рд╕ A
рдореЗрдВ рддрд░реАрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рднреА рд╣реИ ( A.VerifySignature(MethodInfo m1, MethodInfo m2)
) рдФрд░ рд╡рд┐рдзрд┐ рдмрд╛рдЗрдЯ рдХреЛрдб рдХреЗ IL
рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ ( A.IncrementMaxStack
)ред
Program
рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Program.Init
, рддрд░реАрдХреЛрдВ рдХреА bytecode IL
рдкреВрд░реНрд╡-рдкрд░рд┐рдХрд▓рд┐рдд рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рджреЛ рддрд░реАрдХреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо A.VerifySignature
рдХреЙрд▓ рдкрд░ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдХреЗ рдбрд┐рдмрдЧрд░ рдХреЗ рддрд╣рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЖрдкрдХреЛ Program.Init
рдореЗрдВ рдХреЙрд▓ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рд╣реЛрдЧрд╛ Program.Init
рдпрд╣ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред

рдирддреАрдЬрддрди, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Program.a
рджреНрд╡рд╛рд░рд╛ Program.b
рд╡рд┐рдзрд┐ рдФрд░ Program.c
рджреНрд╡рд╛рд░рд╛ Program.d
рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдм рдЖрдкрдХреЛ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рд╕рдВрд╢реЛрдзрди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
private unsafe static uint IncrementMaxStack(IntPtr self, A.ICorJitInfo* comp, A.CORINFO_METHOD_INFO* info, uint flags, byte** nativeEntry, uint* nativeSizeOfCode) { bool flag = info != null; if (flag) { MethodBase methodBase = Ac(info->ftn); bool flag2 = methodBase != null; if (flag2) { bool flag3 = methodBase.MetadataToken == 100663317; if (flag3) { uint flNewProtect; A.VirtualProtect((IntPtr)((void*)info->ILCode), info->ILCodeSize, 4u, out flNewProtect); Marshal.WriteByte((IntPtr)((void*)info->ILCode), 23, 20); Marshal.WriteByte((IntPtr)((void*)info->ILCode), 62, 20); A.VirtualProtect((IntPtr)((void*)info->ILCode), info->ILCodeSize, flNewProtect, out flNewProtect); } else { bool flag4 = methodBase.MetadataToken == 100663316; if (flag4) { uint flNewProtect2; A.VirtualProtect((IntPtr)((void*)info->ILCode), info->ILCodeSize, 4u, out flNewProtect2); Marshal.WriteInt32((IntPtr)((void*)info->ILCode), 6, 309030853); Marshal.WriteInt32((IntPtr)((void*)info->ILCode), 18, 209897853); A.VirtualProtect((IntPtr)((void*)info->ILCode), info->ILCodeSize, flNewProtect2, out flNewProtect2); } } } } return A.originalDelegate(self, comp, info, flags, nativeEntry, nativeSizeOfCode); }
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ MetadataToken
рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐, рдЕрд░реНрдерд╛рддреН 0x6000015
рдФрд░ 0x6000014
рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпреЗ рдЯреЛрдХрдиреНрд╕ Program.h
рдФрд░ Program.g
рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред dnSpy
рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд hex
рд╕рдВрдкрд╛рджрдХ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ, рдордВрдбрд░рд╛рдиреЗ рдкрд░, рд╡рд┐рдзрд┐ рдбреЗрдЯрд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЙрдирдХрд╛ рд╢реАрд░реНрд╖рдХ (рдмреИрдВрдЧрдиреА рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛) рдФрд░ рдмрд╛рдЗрдЯ рдХреЛрдб (рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛), рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк File Offset: 0x00002924
рд╡рд┐рдзрд┐ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, File Offset: 0x00002924
) рд╕реЗ рдкрд╣рд▓реЗ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкрддреЗ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ hex
рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдзрд┐ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЗрдП рд╡рд░реНрдгрд┐рдд рд╕рднреА рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ: рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдПрдВрдЧреЗ, рдХрд┐рд╕реА рднреА рд╣реЗрдХреНрд╕ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдСрдлрд╕реЗрдЯ рдкрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ dnSpy
рд╕реЗ рд╕реАрдЦрд╛ рдерд╛ dnSpy
рдФрд░ рд╣рдо dnSpy
рдореЗрдВ a -> b
рдФрд░ c -> d
рддрд░реАрдХреЛрдВ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред рд╣рдо Program.Init
рд╕реЗ рднреА рд╣рдЯрд╛рддреЗ рд╣реИрдВ Program.Init
рдореЙрдбреНрдпреВрд▓ A
рдХреЛ рд╕рднреА рдХреЙрд▓ рдХрд░реЗрдВ A
рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬрдм рд╣рдо рд╕рдВрд╢реЛрдзрд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд╕реНрд╡реАрд░ рдореЗрдВ рдХреБрдЫ рд╕рдВрджреЗрд╢ рдбрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗрдЧрд╛ рдЬрдм рдореВрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореВрд▓ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╡рд┐рдШрдЯрд┐рдд рдХреЛрдб рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред


рдпрд╣ рдПрдХ рдЙрд▓рдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рдкрд░рд┐рдгрд╛рдореА Python
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреВрдВрдЧрд╛:
from PIL import Image
рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ, рд╣рдореЗрдВ рдПрдХ рдзреНрд╡рдЬ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдФрд░ bmp
рдЫрд╡рд┐ рдорд┐рд▓рддреА рд╣реИред рдЗрд╕ рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдорд┐рд▓рддреА рд╣реИред

0x07 - wopr
рд╣рдордиреЗ рдПрдХ рд╕реИрдиреНрдп рд╕реБрдкрд░ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЗрд╕ AI рдХреЛ "рдЦреЛрдЬрдиреЗ" рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рд╣реИрдХрд┐рдВрдЧ рдХреМрд╢рд▓ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдпрд╣ рдХреНрд▓рд╛рд╕рд┐рдХ 1983 рдХреА рдлрд┐рд▓реНрдо рд╡реЙрд░рдЧреЗрдореНрд╕ рдХреА рддрд░рд╣ рд╣реИред рд╢рд╛рдпрдж рдЬреАрд╡рди рдХрд▓рд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ? рдпрджрд┐ рдЖрдк рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪ рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЖрдкрдХреЛ рдЕрдЧрд▓реА рдЪреБрдиреМрддреА рд╕реЗ рдЧреБрдЬрд░рдиреЗ рджреЗрдВрдЧреЗред рд╣рдо рдерд░реНрдореЛрдиреНрдпреВрдХреНрд▓рд┐рдпрд░ рдпреБрджреНрдз рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдп рдореЗрдВ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди worp.exe
ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдЫ рдХреЛрдб рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрд╡-рдирд┐рд╖реНрдХрд░реНрд╖рдг рд╕рдВрдЧреНрд░рд╣ рд╣реИред рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ _MEIPASS2
ред рдпрджрд┐ рдпрд╣ рдЪрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреБрд░рд╛рд▓реЗрдЦ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдирдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рджрд┐рдП рдЧрдП рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ _MEIPASS2
рд╕рд╛рде рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдкреБрд░рд╛рд▓реЗрдЦ рд╕рд╛рдордЧреНрд░реА:
. тФЬтФАтФА api-ms-win-core-console-l1-1-0.dll тФЬтФАтФА ... тФЬтФАтФА ... тФЬтФАтФА api-ms-win-crt-utility-l1-1-0.dll тФЬтФАтФА base_library.zip тФЬтФАтФА _bz2.pyd тФЬтФАтФА _ctypes.pyd тФЬтФАтФА _hashlib.pyd тФЬтФАтФА libcrypto-1_1.dll тФЬтФАтФА libssl-1_1.dll тФЬтФАтФА _lzma.pyd тФЬтФАтФА pyexpat.pyd тФЬтФАтФА python37.dll тФЬтФАтФА select.pyd тФЬтФАтФА _socket.pyd тФЬтФАтФА _ssl.pyd тФЬтФАтФА this тФВ тФЬтФАтФА __init__.py тФВ тФФтФАтФА key тФЬтФАтФА ucrtbase.dll тФЬтФАтФА unicodedata.pyd тФЬтФАтФА VCRUNTIME140.dll тФФтФАтФА wopr.exe.manifest 1 directory, 56 files
рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо exe
рдореЗрдВ рдкреИрдХ рдХрд┐рдП рдЧрдП Python
рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ, рдореБрдЦреНрдп рдмрд╛рдЗрдирд░реА рдореЗрдВ рдЖрдк Python
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рдд рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: PyMarshal_ReadObjectFromString
, PyEval_EvalCode
рдФрд░ рдЕрдиреНрдпред рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Python
рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд╕реНрдерд╛рдпреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ _MEIPASS2
рдореЗрдВ рдЗрд╕реЗ рдкрде _MEIPASS2
ред PyMarshal_ReadObjectFromString
рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдХреЗ рдореБрдЦреНрдп рдмрд╛рдЗрдирд░реА рдХреЛ рдбреАрдмрдЧ рдореЛрдб рдореЗрдВ рдЪрд▓рд╛рдПрдБред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреНрд░рдордмрджреНрдз Python
рдХреЛрдб рдФрд░ рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЛ рдПрдХ рдмрдлрд░ рдореЗрдВ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЬреНрдЮрд╛рдд рд▓рдВрдмрд╛рдИ рдХреЗ рдмрдлрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдбрдВрдк рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдХреЗрд╡рд▓ 2 рдХреЙрд▓ рдорд┐рд▓реЗ, рдЬрдмрдХрд┐ рджреВрд╕рд░реЗ рдореЗрдВ, рдХреНрд░рдордмрджреНрдз рдСрдмреНрдЬреЗрдХреНрдЯ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред
рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ .pyc
рдлрд╝рд╛рдЗрд▓реЛрдВ (рд╕рдВрдХрд▓рд┐рдд Python
рдмрд╛рдЗрдЯрдХреЛрдб) рдХреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ uncompyle6
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ uncompyle6
ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ 16-рдмрд╛рдЗрдЯ рд╣реЗрдбрд░ рдЬреЛрдбрд╝рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореБрдЭреЗ рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓реА:
00000000: 42 0d 0d 0a 00 00 00 00 de cd 57 5d 00 00 00 00 B.........W].... 00000010: e3 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00 ................ 00000020: 00 40 00 00 00 73 3c 01 00 00 64 00 5a 00 64 01 .@...s<...dZd 00000030: 64 02 6c 01 5a 01 64 01 64 02 6c 02 5a 02 64 01 dlZddlZd
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдлрд╛рдЗрд▓ рдХрд╛ uncompyle6
рдХрд░рддреЗ рд╣реИрдВред
uncompyle6 task.pyc > task.py
рдпрджрд┐ рд╣рдо рд╡рд┐рдШрдЯрд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ BOUNCE = pkgutil.get_data('this', 'key')
рд▓рд╛рдЗрди рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдорд┐рд▓реЗрдЧрд╛ред рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ BOUNCE
рдЪрд░ рдореЗрдВ key
рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдирд╛, рд╣рдо рдХреЗрд╡рд▓ рд╢рд┐рд▓рд╛рд▓реЗрдЦ LOADING...
рджреЗрдЦреЗрдВрдЧреЗ LOADING...
рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдХреБрдЫ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрдкрдШрдЯрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рд╣рдо рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк Python
рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрдХреНрд░ рджреЗрдЦрддреЗ рд╣реИрдВ:
for i in range(256): try: print(lzma.decompress(fire(eye(__doc__.encode()), bytes([i]) + BOUNCE))) except Exception: pass
рдЖрдк рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ print
рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ exec
рд░реВрдк рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рддрд░реНрдХ рдХреЗрд╡рд▓ __doc__.encode()
рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ __doc__.encode()
- рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд╛рдаред print
print
try-except
. . , __doc__
. __doc__
:
import marshal with open('pycode1', 'rb') as inp: data = inp.read() code = marshal.loads(data) doc = code.co_consts[0] with open('doc.txt', 'w') as outp: outp.write(doc)
, __doc__
. , i
, . . wrong
:
trust = windll.kernel32.GetModuleHandleW(None)
, . 0x100000
wrong
, . , .
. z3
:
from z3 import * from stage2 import wrong xor = [212, 162, 242, 218, 101, 109, 50, 31, 125, 112, 249, 83, 55, 187, 131, 206] h = list(wrong()) h = [h[i] ^ xor[i] for i in range(16)] b = 16 * [None] x = [] for i in range(16): x.append(BitVec('x' + str(i), 32)) b[0] = x[2] ^ x[3] ^ x[4] ^ x[8] ^ x[11] ^ x[14] b[1] = x[0] ^ x[1] ^ x[8] ^ x[11] ^ x[13] ^ x[14] b[2] = x[0] ^ x[1] ^ x[2] ^ x[4] ^ x[5] ^ x[8] ^ x[9] ^ x[10] ^ x[13] ^ x[14] ^ x[15] b[3] = x[5] ^ x[6] ^ x[8] ^ x[9] ^ x[10] ^ x[12] ^ x[15] b[4] = x[1] ^ x[6] ^ x[7] ^ x[8] ^ x[12] ^ x[13] ^ x[14] ^ x[15] b[5] = x[0] ^ x[4] ^ x[7] ^ x[8] ^ x[9] ^ x[10] ^ x[12] ^ x[13] ^ x[14] ^ x[15] b[6] = x[1] ^ x[3] ^ x[7] ^ x[9] ^ x[10] ^ x[11] ^ x[12] ^ x[13] ^ x[15] b[7] = x[0] ^ x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[8] ^ x[10] ^ x[11] ^ x[14] b[8] = x[1] ^ x[2] ^ x[3] ^ x[5] ^ x[9] ^ x[10] ^ x[11] ^ x[12] b[9] = x[6] ^ x[7] ^ x[8] ^ x[10] ^ x[11] ^ x[12] ^ x[15] b[10] = x[0] ^ x[3] ^ x[4] ^ x[7] ^ x[8] ^ x[10] ^ x[11] ^ x[12] ^ x[13] ^ x[14] ^ x[15] b[11] = x[0] ^ x[2] ^ x[4] ^ x[6] ^ x[13] b[12] = x[0] ^ x[3] ^ x[6] ^ x[7] ^ x[10] ^ x[12] ^ x[15] b[13] = x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7] ^ x[11] ^ x[12] ^ x[13] ^ x[14] b[14] = x[1] ^ x[2] ^ x[3] ^ x[5] ^ x[7] ^ x[11] ^ x[13] ^ x[14] ^ x[15] b[15] = x[1] ^ x[3] ^ x[5] ^ x[9] ^ x[10] ^ x[11] ^ x[13] ^ x[15] solver = Solver() for i in range(16): solver.add(x[i] < 128) for i in range(16): solver.add(b[i] == h[i]) if solver.check() == sat: m = solver.model() print(bytes([m[i].as_long() for i in x])) else: print('unsat')
, : 5C0G7TY2LWI2YXMB

0x08 тАФ snake
The Flare team is attempting to pivot to full-time twitch streaming video games instead of reverse engineering computer software all day. We wrote our own classic NES game to stream content that nobody else has seen and watch those subscribers flow in. It turned out to be too hard for us to beat so we gave up. See if you can beat it and capture the internet points that we failed to collect.
NES
- . FCEUX
, .. . , .

, , 0x25
. , . NES
- IDA
. inesldr . 0x25
. C82A
, . 0x33
.

, тАФ 0x32
0x25
. , . , FCEUX
. .

0x09 тАФ reloadered
This is a simple challenge, enter the password, receive the key. I hear that it caused problems when trying to analyze it with ghidra. Remember that valid flare-on flags will always end with @flare-on.com
reloaderd.exe
, . , , . , , XOR
, @FLAG.com
, .

, NOP
. , , . . , . , , . , , NOP
, .
, , XOR
, . @flare-on.com
, . :
flag = bytearray(b'D)6\n)\x0f\x05\x1be&\x10\x04+h0/\x003/\x05\x1a\x1f\x0f8\x02\x18B\x023\x1a(\x04*G?\x04&dfM\x107>(>w\x1c?~64*\x00') for i in range(0x539): for j in range(0x34): if (i % 3) == 0 or (i % 7) == 0: flag[j] ^= (i & 0xff) end = b'@flare-on.com' def xor(a, b): return bytes([i^j for i, j in zip(a, b)]) for i in range(len(flag)): print(i, xor(end, flag[i:])) print(xor(flag, b'3HeadedMonkey'*4))

0x0A тАФ Mugatu
Hello,
I'm working an incident response case for Derek Zoolander. He clicked a link and was infected with MugatuWare! As a result, his new headshot compilation GIF was encrypted.
To secure an upcoming runway show, Derek needs this GIF decrypted; however, he refuses to pay the ransom.
We received an additional encrypted GIF from an anonymous informant. The informant told us the GIF should help in our decryption efforts, but we were unable to figure it out.
We're reaching out to you, our best malware analyst, in hopes that you can reverse engineer this malware and decrypt Derek's GIF.
I've included a directory full of files containing:
- MugatuWare malware
- Ransom note (GIFtToDerek.txt)
- Encrypted headshot GIF (best.gif.Mugatu)
- Encrypted informant GIF (the_key_to_success_0000.gif.Mugatu)
Thanks,
Roy
:
- best.gif.Mugatu
- GIFtToDerek.txt
- Mugatuware.exe
- the_key_to_success_0000.gif.Mugatu
, , GIF
-. , .Mugatu
. Mugatuware.exe
. , тАФ . , , .

IDA
, :
import ida_segment import ida_name import ida_bytes import ida_typeinf idata = ida_segment.get_segm_by_name('.idata') type_map = {} for addr in range(idata.start_ea, idata.end_ea, 4): name = ida_name.get_name(addr) if name: tp = ida_typeinf.idc_get_type(addr) if tp: type_map[name] = tp for addr in range(idata.start_ea, idata.end_ea, 4): imp = ida_bytes.get_dword(addr) if imp != 0: imp_name = ida_name.get_name(imp) name_part = imp_name.split('_')[-1] ida_name.set_name(addr, name_part + '_imp') if name_part in type_map: tp = type_map[name_part] ida_typeinf.apply_decl(addr, tp.replace('(', 'func(') + ';')
:

, , in-memory
PE
-. , CrazyPills!!!
ред , . Sleep
, http
-. , , , . , , , . .

- :
- ;
- ;
Mailslots
;really, really, really, ridiculously good looking gifs
;.gif
. .Mugatu
. GIFtToDerek.txt
.
, тАФ 8 . XOR
CrazyPills!!!
, . , :

XTEA
, тАФ BYTE
, DWORD
. . Python
:
def crypt(a, b, key): i = 0 for _ in range(32): t = (i + key[i & 3]) & 0xffffffff a = (a + (t ^ (b + ((b >> 5) ^ (b << 4))))) & 0xffffffff i = (0x100000000 + i - 0x61C88647) & 0xffffffff t = (i + key[(i >> 11) & 3]) & 0xffffffff b = (b + (t ^ (a + ((a >> 5) ^ (a << 4))))) & 0xffffffff return a, b def decrypt(a, b, key): i = 0xc6ef3720 for _ in range(32): t = (i + key[(i >> 11) & 3]) & 0xffffffff b = (0x100000000 + b - (t ^ (a + ((a >> 5) ^ (a << 4))))) & 0xffffffff i = (i + 0x61C88647) & 0xffffffff t = (i + key[i & 3]) & 0xffffffff a = (0x100000000 + a - (t ^ (b + ((b >> 5) ^ (b << 4))))) & 0xffffffff return a, b
, the_key_to_success_0000.gif.Mugatu
. , . :

, , . C
. GIF
-.
#include <stdio.h> #include <unistd.h> void decrypt(unsigned int * inp, unsigned int * outp, unsigned char * key) { unsigned int i = 0xc6ef3720; unsigned int a = inp[0]; unsigned int b = inp[1]; unsigned int t; for(int j = 0; j < 32; j++) { t = i + key[(i >> 11) & 3]; b -= t ^ (a + ((a >> 5) ^ (a << 4))); i += 0x61C88647; t = i + key[i & 3]; a -= t ^ (b + ((b >> 5) ^ (b << 4))); } outp[0] = a; outp[1] = b; } int main() { int fd = open("best.gif.Mugatu", 0); unsigned int inp[2]; unsigned int outp[2]; unsigned int key = 0; read(fd, inp, 8); close(fd); for(unsigned long long key = 0; key < 0x100000000; key++) { if((key & 0xffffff) == 0) { printf("%lf\n", ((double)key) / ((double)0x100000000) * 100.0); } decrypt(inp, outp, &key); if( ((char *)outp)[0] == 'G' && ((char *)outp)[1] == 'I' && ((char *)outp)[2] == 'F' && ((char *)outp)[5] == 'a') { printf("%#llx\n", key); } } }
0xb1357331
:

0x0B тАФ vv_max
Hey, at least its not subleq.
vv_max.exe
, . 256- . AVX2
, vpermd
, vpslld
. - :
0000 clear_regs 0001 r0 = 393130324552414c46 0023 r1 = 3030303030303030303030303030303030303030303030303030303030303030 0045 r3 = 1a1b1b1b1a13111111111111111111151a1b1b1b1a1311111111111111111115 0067 r4 = 1010101010101010080408040201101010101010101010100804080402011010 0089 r5 = b9b9bfbf041310000000000000000000b9b9bfbf04131000 00ab r6 = 2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f 00cd r10 = 140014001400140014001400140014001400140014001400140014001400140 00ef r11 = 1100000011000000110000001100000011000000110000001100000011000 0111 r12 = ffffffff0c0d0e08090a040506000102ffffffff0c0d0e08090a040506000102 0133 r13 = ffffffffffffffff000000060000000500000004000000020000000100000000 0155 r16 = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0177 r17 = 6a09e667bb67ae853c6ef372a54ff53a510e527f9b05688c1f83d9ab5be0cd19 0199 r18 = 428a2f9871374491b5c0fbcfe9b5dba53956c25b59f111f1923f82a4ab1c5ed5 01bb r19 = 300000002000000010000000000000007000000060000000500000004 01dd r20 = 0 01ff r21 = 100000001000000010000000100000001000000010000000100000001 0221 r22 = 200000002000000020000000200000002000000020000000200000002 0243 r23 = 300000003000000030000000300000003000000030000000300000003 0265 r24 = 400000004000000040000000400000004000000040000000400000004 0287 r25 = 500000005000000050000000500000005000000050000000500000005 02a9 r26 = 600000006000000060000000600000006000000060000000600000006 02cb r27 = 700000007000000070000000700000007000000070000000700000007 02ed r20 = vpermd(r0, r20) 02f1 r21 = vpermd(r0, r21) 02f5 r22 = vpermd(r0, r22) 02f9 r23 = vpermd(r0, r23) 02fd r24 = vpermd(r0, r24) 0301 r25 = vpermd(r0, r25) 0305 r26 = vpermd(r0, r26) 0309 r27 = vpermd(r0, r27) 030d r7 = vpsrld(r1, 4) 0311 r28 = r20 ^ r21 0315 r28 = r28 ^ r22 0319 r28 = r28 ^ r23 031d r28 = r28 ^ r24 0321 r28 = r28 ^ r25 0325 r28 = r28 ^ r26 0329 r28 = r28 ^ r27 032d r7 = r7 & r6 0331 r29 = vpslld(r17, 7) 0335 r30 = vpsrld(r17, 25) 0339 r15 = r29 | r30 033d r8 = vpcmpeqb(r1, r6) 0341 r29 = vpslld(r17, 21) 0345 r30 = vpsrld(r17, 11) 0349 r29 = r29 | r30 034d r15 = r15 ^ r29 0351 r8 = vpcmpeqb(r1, r6) 0355 r29 = vpslld(r17, 26) 0359 r30 = vpsrld(r17, 6) 035d r29 = r29 | r30 0361 r15 = r15 ^ r29 0365 r29 = r20 ^ r16 0369 r30 = r20 & r18 036d r29 = r29 ^ r30 0371 r15 = add_d(r29, r15) 0375 r20 = add_d(r15, r0) 0379 r7 = add_b(r8, r7) 037d r29 = r20 ^ r28 0381 r17 = vpermd(r29, r19) 0385 r7 = vpshufb(r5, r7) 0389 r29 = vpslld(r17, 7) 038d r30 = vpsrld(r17, 25) 0391 r15 = r29 | r30 0395 r29 = vpslld(r17, 21) 0399 r30 = vpsrld(r17, 11) 039d r29 = r29 | r30 03a1 r15 = r15 ^ r29 03a5 r29 = vpslld(r17, 26) 03a9 r30 = vpsrld(r17, 6) 03ad r29 = r29 | r30 03b1 r15 = r15 ^ r29 03b5 r2 = add_b(r1, r7) 03b9 r29 = r21 ^ r16 03bd r30 = r21 & r18 03c1 r29 = r29 ^ r30 03c5 r15 = add_d(r29, r15) 03c9 r21 = add_d(r15, r0) 03cd r29 = r21 ^ r28 03d1 r17 = vpermd(r29, r19) 03d5 r20 = r20 ^ r21 03d9 r29 = vpslld(r17, 7) 03dd r30 = vpsrld(r17, 25) 03e1 r15 = r29 | r30 03e5 r29 = vpslld(r17, 21) 03e9 r30 = vpsrld(r17, 11) 03ed r29 = r29 | r30 03f1 r15 = r15 ^ r29 03f5 r29 = vpslld(r17, 26) 03f9 r30 = vpsrld(r17, 6) 03fd r29 = r29 | r30 0401 r15 = r15 ^ r29 0405 r7 = vpmaddubsw(r2, r10) 0409 r29 = r22 ^ r16 040d r30 = r22 & r18 0411 r29 = r29 ^ r30 0415 r15 = add_d(r29, r15) 0419 r22 = add_d(r15, r0) 041d r29 = r22 ^ r28 0421 r17 = vpermd(r29, r19) 0425 r20 = r20 ^ r22 0429 r29 = vpslld(r17, 7) 042d r30 = vpsrld(r17, 25) 0431 r15 = r29 | r30 0435 r29 = vpslld(r17, 21) 0439 r30 = vpsrld(r17, 11) 043d r29 = r29 | r30 0441 r15 = r15 ^ r29 0445 r29 = vpslld(r17, 26) 0449 r30 = vpsrld(r17, 6) 044d r29 = r29 | r30 0451 r15 = r15 ^ r29 0455 r2 = vpmaddwd(r7, r11) 0459 r29 = r23 ^ r16 045d r30 = r23 & r18 0461 r29 = r29 ^ r30 0465 r15 = add_d(r29, r15) 0469 r23 = add_d(r15, r0) 046d r29 = r23 ^ r28 0471 r17 = vpermd(r29, r19) 0475 r20 = r20 ^ r23 0479 r29 = vpslld(r17, 7) 047d r30 = vpsrld(r17, 25) 0481 r15 = r29 | r30 0485 r29 = vpslld(r17, 21) 0489 r30 = vpsrld(r17, 11) 048d r29 = r29 | r30 0491 r15 = r15 ^ r29 0495 r29 = vpslld(r17, 26) 0499 r30 = vpsrld(r17, 6) 049d r29 = r29 | r30 04a1 r15 = r15 ^ r29 04a5 r29 = r24 ^ r16 04a9 r30 = r24 & r18 04ad r29 = r29 ^ r30 04b1 r15 = add_d(r29, r15) 04b5 r24 = add_d(r15, r0) 04b9 r29 = r24 ^ r28 04bd r17 = vpermd(r29, r19) 04c1 r20 = r20 ^ r24 04c5 r29 = vpslld(r17, 7) 04c9 r30 = vpsrld(r17, 25) 04cd r15 = r29 | r30 04d1 r29 = vpslld(r17, 21) 04d5 r30 = vpsrld(r17, 11) 04d9 r29 = r29 | r30 04dd r15 = r15 ^ r29 04e1 r29 = vpslld(r17, 26) 04e5 r30 = vpsrld(r17, 6) 04e9 r29 = r29 | r30 04ed r15 = r15 ^ r29 04f1 r29 = r25 ^ r16 04f5 r30 = r25 & r18 04f9 r29 = r29 ^ r30 04fd r15 = add_d(r29, r15) 0501 r25 = add_d(r15, r0) 0505 r29 = r25 ^ r28 0509 r17 = vpermd(r29, r19) 050d r20 = r20 ^ r25 0511 r2 = vpshufb(r2, r12) 0515 r29 = vpslld(r17, 7) 0519 r30 = vpsrld(r17, 25) 051d r15 = r29 | r30 0521 r29 = vpslld(r17, 21) 0525 r30 = vpsrld(r17, 11) 0529 r29 = r29 | r30 052d r15 = r15 ^ r29 0531 r29 = vpslld(r17, 26) 0535 r30 = vpsrld(r17, 6) 0539 r29 = r29 | r30 053d r15 = r15 ^ r29 0541 r29 = r26 ^ r16 0545 r30 = r26 & r18 0549 r29 = r29 ^ r30 054d r15 = add_d(r29, r15) 0551 r26 = add_d(r15, r0) 0555 r29 = r26 ^ r28 0559 r17 = vpermd(r29, r19) 055d r20 = r20 ^ r26 0561 r29 = vpslld(r17, 7) 0565 r30 = vpsrld(r17, 25) 0569 r15 = r29 | r30 056d r29 = vpslld(r17, 21) 0571 r30 = vpsrld(r17, 11) 0575 r29 = r29 | r30 0579 r15 = r15 ^ r29 057d r29 = vpslld(r17, 26) 0581 r30 = vpsrld(r17, 6) 0585 r29 = r29 | r30 0589 r15 = r15 ^ r29 058d r2 = vpermd(r2, r13) 0591 r29 = r27 ^ r16 0595 r30 = r27 & r18 0599 r29 = r29 ^ r30 059d r15 = add_d(r29, r15) 05a1 r27 = add_d(r15, r0) 05a5 r29 = r27 ^ r28 05a9 r17 = vpermd(r29, r19) 05ad r20 = r20 ^ r27 05b1 r19 = ffffffffffffffffffffffffffffffffffffffffffffffff 05d3 r20 = r20 & r19 05d7 r31 = 2176620c3a5c0f290b583618734f07102e332623780e59150c05172d4b1b1e22
FLARE2019
. , , . , FLARE2019
. r2
r20
. , r20
. r2
тАФ 6 r2
. , 6 . Frida
:
// vvmax.js var modules = Process.enumerateModules(); var base = modules[0].base; Interceptor.attach(base.add(0x1665), function() { var p = this.context.rdx.add(0x840); var res = p.readByteArray(32); send(null, res); });
:

0x0C тАФ help
You're my only hope FLARE-On player! One of our developers was hacked and we're not sure what they took. We managed to set up a packet capture on the network once we found out but they were definitely already on the system. I think whatever they installed must be buggy тАФ it looks like they crashed our developer box. We saved off the dump file but I can't make heads or tails of it тАФ PLEASE HELP!!!!!!
. RAM
- . 4444
, 6666
, 7777
8888
. , , , RAM
-. volatility
. volatility
Win10x64_15063
, , Win7SP1x64
, .
volatility
:
$ volatility --profile Win7SP1x64 -f help.dmp modules Volatility Foundation Volatility Framework 2.6 Offset(V) Name Base Size File ------------------ -------------------- ------------------ ------------------ ---- 0xfffffa800183e890 ntoskrnl.exe 0xfffff80002a49000 0x5e7000 \SystemRoot\system32\ntoskrnl.exe ... 0xfffffa800428ff30 man.sys 0xfffff880033bc000 0xf000 \??\C:\Users\FLARE ON 2019\Desktop\man.sys
:
$ volatility --profile Win7SP1x64 -f help.dmp moddump --base 0xfffff880033bc000 -D drivers Volatility Foundation Volatility Framework 2.6 Module Base Module Name Result ------------------ -------------------- ------ 0xfffff880033bc000 man.sys Error: e_magic 0000 is not a valid DOS signature.
, . volshell
.
$ volatility --profile Win7SP1x64 -f help.dmp volshell In [1]: db(0xfffff880033bc000) 0xfffff880033bc000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff880033bc010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff880033bc020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff880033bc030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff880033bc040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff880033bc050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff880033bc060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff880033bc070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ In [2]: db(0xfffff880033bc000 + 0x1100) 0xfffff880033bd100 01 48 8b 4c 24 20 48 8b 44 24 28 48 89 41 08 48 .HL$.HD$(HAH 0xfffff880033bd110 83 c4 18 c3 cc cc cc cc cc cc cc cc cc cc cc cc ................ 0xfffff880033bd120 48 89 4c 24 08 48 83 ec 38 48 8b 44 24 40 0f be HL$.H..8H.D$@.. 0xfffff880033bd130 48 43 48 8b 44 24 40 0f be 40 42 83 c0 01 3b c8 HCH.D$@..@B...;. 0xfffff880033bd140 7e 27 45 33 c9 41 b8 15 5b 00 00 48 8d 15 de 44 ~'E3.A..[..H...D 0xfffff880033bd150 00 00 48 8d 0d 07 45 00 00 ff 15 71 4f 00 00 c7 ..H...E....qO... 0xfffff880033bd160 44 24 20 00 00 00 00 eb 08 c7 44 24 20 01 00 00 D$........D$.... 0xfffff880033bd170 00 48 8b 44 24 40 48 8b 80 b8 00 00 00 48 83 c4 .HD$@H......H.. In [4]: man = addrspace().read(0xfffff880033bc000, 0xf000) In [5]: with open('man_writeup.sys', 'wb') as f: ...: f.write(man) ...:
, , moddump
. . . - , , .
RC4
. , .
user-space
. DLL
- . DLL
- ( m.dll
), . , . :
- (
+0x8
) _EPROCESS
( +0x68
)- (
+0x48
) - (
+0x58
)
DLL
- RC4
, 0x2c
- , 0x48
.
volatility
volshell
:
import struct from Crypto.Cipher import ARC4 head = 0xfffff880033c8158 krnl = addrspace() def u64(x): return struct.unpack('Q', x)[0] fd = u64(krnl.read(head, 8)) while True: proc_addr = u64(krnl.read(fd + 0x68, 8)) base = u64(krnl.read(fd + 0x48, 8)) key = krnl.read(fd + 0x48, 0x2c) sz = u64(krnl.read(fd + 0x58, 8)) fd = u64(krnl.read(fd, 8)) p = obj.Object('_EPROCESS', proc_addr, krnl) print p.ImageFileName.v(), hex(proc_addr), hex(base), hex(sz) proc_space = p.get_process_address_space() dump = proc_space.read(base, sz) if dump[:0x100] == '\x00' * 0x100: dump = ARC4.new(key).decrypt(dump) with open('proc_{:016x}'.format(base), 'wb') as f: f.write(dump) if fd == head: break
, , RC4
. IDA
, , :
IDA from __future__ import print_function import sys import re from idaapi import get_func, decompile, get_name_ea, auto_wait, BADADDR from idaapi import cot_call, cot_obj, init_hexrays_plugin, qexit import ida_typeinf import ida_lines def rc4(key, data): S = list(range(256)) j = 0 for i in list(range(256)): j = (j + S[i] + ord(key[i % len(key)])) % 256 S[i], S[j] = S[j], S[i] j = 0 y = 0 out = [] for char in data: j = (j + 1) % 256 y = (y + S[j]) % 256 S[j], S[y] = S[y], S[j] out.append(chr(ord(char) ^ S[(S[j] + S[y]) % 256])) return ''.join(out) def decrypt_stack_str_args(ea): func = get_func(ea) if func is None: return try: c_func = decompile(func) c_func.pseudocode except Exception as ex: return for citem in c_func.treeitems: citem = citem.to_specific_type if citem.is_expr() and\ citem.op == cot_call and\ citem.ea == ea: args = [] key = citem.a[0] key_len = citem.a[1] s = citem.a[2] s_len = citem.a[3] def get_var_idx(obj): while obj.opname != 'var': if obj.opname in ('ref', 'cast'): obj = obj.x else: raise Exception('can\'t find type') return obj.v.idx if key_len.opname != 'num' or s_len.opname != 'num': print('[!] can\'t get length: 0x{:08x}'.format(ea)) else: try: key_len_val = key_len.n._value s_len_val = s_len.n._value print('0x{:08x}'.format(ea), 'key_len =', key_len_val, ', s_len =', s_len_val) hx_view = idaapi.open_pseudocode(ea, -1) key_var_stkoff = hx_view.cfunc.get_lvars()[get_var_idx(key)].location.stkoff() s_var_stkoff = hx_view.cfunc.get_lvars()[get_var_idx(s)].location.stkoff() key_var = [v for v in hx_view.cfunc.get_lvars() if v.location.stkoff() == key_var_stkoff][0] tif = ida_typeinf.tinfo_t() ida_typeinf.parse_decl(tif, None, 'unsigned __int8 [{}];'.format(key_len_val), 0) hx_view.set_lvar_type(key_var, tif) s_var = [v for v in hx_view.cfunc.get_lvars() if v.location.stkoff() == s_var_stkoff][0] tif = ida_typeinf.tinfo_t() ida_typeinf.parse_decl(tif, None, 'unsigned __int8 [{}];'.format(s_len_val + 1), 0) hx_view.set_lvar_type(s_var, tif) key_var = [v for v in hx_view.cfunc.get_lvars() if v.location.stkoff() == key_var_stkoff][0] s_var = [v for v in hx_view.cfunc.get_lvars() if v.location.stkoff() == s_var_stkoff][0] key_regex = re.compile('{}\[(.+)\] = (.+);'.format(key_var.name)) s_regex = re.compile('{}\[(.+)\] = (.+);'.format(s_var.name)) key = bytearray(key_len_val) s = bytearray(s_len_val + 1) src = '\n'.join([ida_lines.tag_remove(i.line) for i in hx_view.cfunc.pseudocode]) for i, j in s_regex.findall(src): s[int(i)] = (0x100 + int(j)) & 0xff for i, j in key_regex.findall(src): key[int(i)] = (0x100 + int(j)) & 0xff key = ''.join(chr(i) for i in key) s = ''.join(chr(i) for i in s) result = rc4(key, s[:-1])
:

. :
m.dll
тАФ , . 4444
. тАФ ;n.dll
тАФ 192.168.1.243
;c.dll
тАФ RC4
. ;k.dll
тАФ (keylogger);s.dll
тАФ ;f.dll
тАФ .
, XOR
8. 4444
, .. . : , тАФ . , - .
( 4444
) . , - . , . :
- keys.kdb
- C:\
- C:\keypass\keys.kdb
, f.dll
: keys.kdb
, .
6666
. LZNT1
RC4
XOR
. , XOR
- , .. . RC4
, RAM
-: FLARE ON 2019
. , GetUserNameA
, , - , RC4
. LZNT1
:
from ctypes import * nt = windll.ntdll for fname in ['input']: with open(fname, 'rb') as f: buf = f.read() dec_data = create_string_buffer(0x10000) final_size = c_ulong(0) status = nt.RtlDecompressBuffer( 0x102,
6666
. :
00000000: CC 69 94 FA 6A 37 18 29 CB 8D 87 EF 11 63 8E 73 .i..j7.).....cs 00000010: FE AB 43 3B B3 94 28 4B 4D 19 00 00 00 4F DB C7 ..C;..(KM....O.. 00000020: F3 1E E4 13 15 34 8F 51 A9 2B C2 D7 C1 96 78 F7 .....4.Q.+....x. 00000030: 91 98
, :
00000000: 19 00 00 00 4F DB C7 F3 1E E4 13 15 34 8F 51 A9 ....O.......4.Q. 00000010: 2B C2 D7 C1 96 78 F7 91 98 +....x...
4 тАФ , 25. :
00000000: 12 B0 00 43 3A 5C 6B 65 79 70 61 04 73 73 01 70 ...C:\keypa.ss.p 00000010: 73 2E 6B 64 62 s.kdb
C:\keypass\keys.kdb
. , , . 6666
тАФ KeePass
.
7777
BMP
. XOR
, , , .. . , , KeePass
.


8888
k.dll
тАФ .
C:\Windows\system32\cmd.exe nslookup googlecom ping 1722173110 nslookup soeblogcom nslookup fiosquatumgatefiosrouterhome C:\Windows\system32\cmd.exe Start Start menu Start menu chrome www.flare-on.com - Google Chrome tis encrypting something twice better than once Is encrypting something twice better than once? - Google Search - Google Chrome Start Start menu Start menu keeKeePass <DYN_TITLE> th1sisth33nd111 KeePass keys.kdb - KeePass Is encrypting something twice better than once? - Google Search - Google Chrome Start Start menu Start menu KeePass <DYN_TITLE> th1sisth33nd111 Open Database - keys.kdb KeePass Start Start menu Start menu KeePass Start menu Start menu Start menu KeePass <DYN_TITLE> th1sisth33nd111
th1sisth33nd111
, . , . , keylogger . , , ping
. hashcat
KeePass
, . :
$ strings help.dmp | grep -i '3nd!' !s_iS_th3_3Nd!!!
Th
.

. , -.
0x0D тАФ
, . , , . , volatility
, . ( UTC+3:00):